2016-05-15 4 views
3

Я хочу, чтобы принести цены акций с веб-сайта: http://www.bseindia.com/ Например, цена акций выглядит как «S & P BSE: 25,489.57» .Я хочу получать числовую часть его как «25489.57»Extract, используя Beautiful Soup

Это код, который я написал на данный момент. Он извлекает весь div, в котором отображается эта сумма, но не сумма.

Ниже приведен код:

from bs4 import BeautifulSoup 
from urllib.request import urlopen 



page = "http://www.bseindia.com" 

html_page = urlopen(page) 

html_text = html_page.read() 
soup = BeautifulSoup(html_text,"html.parser") 
divtag = soup.find_all("div",{"class":"sensexquotearea"}) 
for oye in divtag: 
    tdidTags = oye.find_all("div", {"class": "sensexvalue2"}) 

    for tag in tdidTags: 
     tdTags = tag.find_all("div",{"class":"newsensexvaluearea"}) 
     for newtag in tdTags: 
      tdnewtags = newtag.find_all("div",{"class":"sensextext"}) 
      for rakesh in tdnewtags: 
       tdtdsp1 = rakesh.find_all("div",{"id":"tdsp"}) 
       for texts in tdtdsp1: 
        print(texts) 
+0

Мне кажется, что число, которое вы ищете, не подается статически (это не строка исходного HTML). – roadrunner66

+0

Спасибо за ответ. Любой способ, которым эта задача может быть выполнена? – RakeshKirola

+1

Да, это может быть полностью выполнено, я отправлю ответ в секунду, показывая вам, как делать то, что делает javascript на этой странице. – Keatinge

ответ

6

Я посмотрел вокруг в том, что происходит, когда эта страница загружает информацию, и я был в состоянии смоделировать на JavaScript делает в python.

я узнал, что он ссылается на страницу с именем IndexMovers.aspx?ln=encheck it out here enter image description here

Похоже, эта страница является разделенный запятыми список вещей. Сначала приходит имя, далее идет цена, а затем пара других вещей, которые вам не нужны.

Чтобы имитировать это в python, мы запрашиваем страницу, разделяем ее запятыми, затем читаем каждое шестое значение в списке, добавляя это значение и значение после этого в новый список под названием stockInformation.

Теперь мы можем просто перебрать биржевой информации и получить имя, используя item[0] и цену с item[1]

import requests 

newUrl = "http://www.bseindia.com/Msource/IndexMovers.aspx?ln=en" 
response = requests.get(newUrl).text 
commaItems = response.split(",") 


#create list of stocks, each one containing information 
#index 0 is the name, index 1 is the price 
#the last item is not included because for some reason it has no price info on indexMovers page 
stockInformation = [] 
for i, item in enumerate(commaItems[:-1]): 
    if i % 6 == 0: 
     newList = [item, commaItems[i+1]] 
     stockInformation.append(newList) 


#print each item and its price from your list 
for item in stockInformation: 
    print(item[0], "has a price of", item[1]) 

Это печатает:

S&P BSE SENSEX has a price of 25489.57 
SENSEX#S&P BSE 100 has a price of 7944.50 
BSE-100#S&P BSE 200 has a price of 3315.87 
BSE-200#S&P BSE MidCap has a price of 11156.07 
MIDCAP#S&P BSE SmallCap has a price of 11113.30 
SMLCAP#S&P BSE 500 has a price of 10399.54 
BSE-500#S&P BSE GREENEX has a price of 2234.30 
GREENX#S&P BSE CARBONEX has a price of 1283.85 
CARBON#S&P BSE India Infrastructure Index has a price of 152.35 
INFRA#S&P BSE CPSE has a price of 1190.25 
CPSE#S&P BSE IPO has a price of 3038.32 
#and many more... (total of 40 items) 

которая, очевидно, equivlent к значениям, указанным на страница enter image description here

Итак, у вас есть это, вы можете имитировать точно, что t javascript на этой странице делает для загрузки информации. Infact у вас теперь есть еще больше информации, чем просто было показано вам на странице, и запрос будет быстрее, потому что мы загружаем только данные, а не весь этот посторонний html.

+0

Спасибо за ответ :) – RakeshKirola

3

Если посмотреть в исходный код вашей страницы (например, путем сохранения его в файл и открыв его в редакторе), вы увидите, что фактическая цена акций 25 489,57 не отображается напрямую. Цена не находится в сохраненном html-коде, но загружена по-другому.

Вы можете использовать связанную страницу, где число обнаружиться:

http://www.bseindia.com/sensexview/indexview_new.aspx?index_Code=16&iname=BSE30

+0

Спасибо за ответ. Так нет способа, которым мы можем получить цену акций? – RakeshKirola

+0

Я не говорю, что нет способа, я просто говорю, что было бы не так сложно сделать это по-другому. Если вы хотите извлечь его с этой стороны, вам нужно будет понять код html и попытаться выяснить, как отображается этот номер, он не является жестко закодированным, но каким-то образом создается динамически. – tfv

+0

Ok. Спасибо за ваш вклад :) – RakeshKirola