Ошибка Python — Список вне диапазона при очистке веб-страниц

#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-код.