#python #web-scraping
Вопрос:
Я запускаю этот код на python, и он выдает мне сообщение об ошибке
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-9-6ff1d459c8bd> in <module>
6 soup = BeautifulSoup(data, 'html5lib')
7 df = pd.DataFrame(columns=["Name", "Sector", "Price", "Price/Earnings", "Dividend_Yield", "Earnings/Share", "52_Week_Low", "52_Week_High", "Market_Cap", "EBITDA"])
----> 8 for row in soup.find_all('tbody')[1].find_all('tr'):
9 col = row.find_all("td")
10 Name = col[0].text
IndexError: list index out of range
Код, который я должен выполнить для очистки веб-страниц python, таков,
import pandas as pd
import requests
from bs4 import BeautifulSoup
url = "https://www.kaggle.com/priteshraj10/sp-500-companies"
data = requests.get(url).text
soup = BeautifulSoup(data, 'html5lib')
df = pd.DataFrame(columns=["Name", "Sector", "Price", "Price/Earnings", "Dividend_Yield", "Earnings/Share", "52_Week_Low", "52_Week_High", "Market_Cap", "EBITDA"])
for row in soup.find_all('tbody')[1].find_all('tr'):
col = row.find_all("td")
Name = col[0].text
Sector = col[1].text
Price = col[2].text
Price_Earnings = col[3].text
Dividend_Yield = col[4].text
Earnings_Share = col[5].text
Week_Low = col[6].text
Week_High = col[7].text
Market_Cap = col[8].text
EBITDA = col[9].text
df = df.append({"Name":Name,"Sector":Sector,"Price":Price,"Price_Earnings":Price_Earnings,"Dividend_Yield":Dividend_Yield,"Earnings_Share":Earnings_Share,"Week_Low":Week_Low,"Week_High":Week_High,"Market_Cap":Market_Cap,"EBITDA":EBITDA}, ignore_index=True)
Вы можете мне в этом помочь?
Комментарии:
1.
tbody
досент существует, вы имеете в виду тело?, что именно вы хотите найти? при использовании.find_all('tbody')
вы получаете пустой список обратно.2. Страница является динамической/отображается после запросов. Во-вторых, есть кнопка загрузки, вам не нужно очищать таблицы, просто скачайте ее.
Ответ №1:
Если вы попытаетесь распечатать переменную soup
, вы увидите, что возвращаемый HTML-код не содержит нужной вам информации, вероятно, потому, что на сайте есть блок, позволяющий избежать очистки веб-страниц
Ответ №2:
По-видимому, эта строка кода возвращает вам список
for row in soup.find_all('tbody')[1]
И он ожидает, что по крайней мере два элемента (индексация списка python начинается с 0), но это не так.
Что вы могли бы сделать, так это распечатать этот товар:
print(soup.find_all('tbody'))
Чтобы узнать, что вы пытаетесь получить доступ к индексу позиции 1, и почему его там нет.
Кроме того, если вы хотите проверить длину:
print(len(soup.find_all('tbody')))
Оно должно быть меньше 1, отсюда и ошибка.
Я бы рекомендовал вам вместо печати использовать отладчик, чтобы выяснить, что у вас с кодом.
Проблема , похоже, в том, что веб-сайт, который вы пытаетесь очистить, вероятно, каким-то образом изменил свой HTML-код.