#python #web-scraping #beautifulsoup
Вопрос:
Я пытаюсь удалить данные о доходах акций с веб-сайта. В нерабочее время код работает. В часы работы рынка код большую часть времени будет указывать «индекс списка вне диапазона». Я понимаю, что это связано с тем, что html-код веб-сайта над частью данных, которые я хочу изменить, или выпадает для загрузки чего-то другого, но есть ли что-нибудь с этим поделать? Или я просто во власти того, что делает сайт?
import requests
from bs4 import BeautifulSoup
headers = {'User Agent':'Mozilla/5.0'}
stocks = ['AAPL']
for stock in stocks:
url = f'https://www.marketwatch.com/investing/stock/{stock}/analystestimates?mod=mw_quote_tab'
res = requests.get(url, headers = headers)
soup = BeautifulSoup(res.text, 'lxml')
thisyear = soup.findAll('th', class_ = "table__cell")[8].text
print(thisyear)
Заранее спасибо.
Ответ №1:
Вы в основном находитесь во власти веб-сайта. Было бы предпочтительнее найти API с теми же/похожими данными, если это возможно.
Не видя трассировки, IndexError
это, скорее всего , из [8]
или, более конкретно, из soup.findAll('th', class_ = "table__cell")
возвращаемого списка с менее чем 9 элементами.
Вы можете назначить items = soup.findAll(..)
и проверить if len(items) >= 9
, прежде чем получать это значение, и/или вызвать другой метод очистки. Вы также можете завернуть его в блок try-catch:
def main():
for stock in stocks:
try2scrape(stock)
def try2scrape(stock):
try:
return scrape_data(stock)
except IndexError as e:
return scrape_data_another_way(stock) # or just error