Информация, которую вы пытаетесь получить, кажется, заполняется динамически с использованием javascript, и, вероятно, поэтому вы не можете ее получить. Таким образом, чтобы обойти это, вы можете использовать selenium webdriver
для извлечения динамического контента.
Вот как выглядит код:
import csv
from bs4 import BeautifulSoup
from selenium import webdriver
output_file = open('bse.csv', 'w')
with open("bselist.csv") as f:
for row in csv.reader(f):
for stock in row:
url = "https://www.bseindia.com/stock-share-price/{}".format(stock)
driver = webdriver.Chrome('/path/to/chromedriver')
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
div = soup.find_all('div', {"class": "newscripcotent5"})[0]
outer_table = div.find_all('table')[0]
inner_table = outer_table.findChildren("table")[0]
rows = inner_table.findChildren("tr")
for row in rows:
cols = row.findChildren("td")
if len(cols) < 2:
continue
output_file.write(stock + "," + cols[0].getText() + "," + cols[1].getText() + "\n")
print(stock + " " + cols[0].getText() + " " + cols[1].getText())
f.close()
Обязательно замените /path/to/chromedriver
на соответствующий путь к chromedriver
.
Итак, если ваш bselist.csv
содержит:
avanti-feeds-ltd/avanti/512573/
Вы получите следующий вывод:
avanti-feeds-ltd/avanti/512573/ 52 Week High (adjusted) 999.00(13/11/2017)
avanti-feeds-ltd/avanti/512573/ 52 Week Low (adjusted) 410.26(05/06/2018)
avanti-feeds-ltd/avanti/512573/ 52 Week High (Unadjusted) 3,000.00(13/11/2017)
avanti-feeds-ltd/avanti/512573/ 52 Week Low (Unadjusted) 507.00(02/07/2018)
avanti-feeds-ltd/avanti/512573/ Month H/L 659.34/410.26
avanti-feeds-ltd/avanti/512573/ Week H/L 615.00/507.00
Если у вас еще нет selenium
и chromedriver
, вам необходимо сначала установить его. Я установил это на моем Mac OS:
sudo easy_install selenium
sudo easy_install chromedriver
Вам могут пригодиться следующие сообщения: