Создание веб-сайта с использованием BS4 — «Длина передаваемых значений равна 0, индекс подразумевает 7»

#python #pandas #beautifulsoup

#python #pandas #beautifulsoup

Вопрос:

Я получаю сообщение об ошибке, что длина переданного значения 0?

Это мой код:

 import bs4 as bs 
import urllib
import urllib.request
import pandas as pd

draft2018 ="https://en.wikipedia.org/wiki/2018_NBA_draft"
draftpage =urllib.request.urlopen(draft2018)
soup=bs.BeautifulSoup(draftpage,"html.parser")

columns = ['Round', 'Pick', 'Player', 'Position',
           'Nationality', 'Team', 'School/club team']

df = pd.DataFrame(columns=columns)

table = soup.find("table",{"class":"wikitable sortable plainrowheaders"}).tbody

trs = table.find_all("tr")

for tr in trs:
    tds = tr.find_all('td')
    row = [td.text.replace('n','') for td in tds]
    df = df.append(pd.Series(row, index=columns), ignore_index=True)
  

Кто-нибудь может объяснить причину этого?

Ответ №1:

Используйте read_html для возврата списка фреймов данных и выберите 4. Фрейм данных путем индексации [3] , затем rename столбцы по словарю:

 draft2018 = "https://en.wikipedia.org/wiki/2018_NBA_draft"
d = {'Rnd.':'Round','Pos.':'Position','Nationality[n 1]':'Nationality'}
df = pd.read_html(draft2018)[3].rename(columns=d)
print(df.head())
   Round  Pick             Player Position    Nationality  
0      1     1      Deandre Ayton        C        Bahamas   
1      1     2  Marvin Bagley III       PF  United States   
2      1     3        Luka Dončić    PG/SF       Slovenia   
3      1     4  Jaren Jackson Jr.       PF  United States   
4      1     5         Trae Young       PG  United States   

                                      Team    School / club team  
0                             Phoenix Suns         Arizona (Fr.)  
1                         Sacramento Kings            Duke (Fr.)  
2      Atlanta Hawks (traded to Dallas)[a]   Real Madrid (Spain)  
3                        Memphis Grizzlies  Michigan State (Fr.)  
4  Dallas Mavericks (traded to Atlanta)[a]        Oklahoma (Fr.)  
  

Комментарии:

1. Почему индекс [3]?

2. @MohitMotwani — это 4.Фрейм данных из списка фреймов данных

3. @MohitMotwani — Точно.

4. О, это имеет смысл. Спасибо!

Ответ №2:

Просто чтобы продемонстрировать проблему, попробуйте напечатать вашу строку:

 print(row)
  

Первый список будет напечатан пустым, и именно поэтому возникает ошибка. Фрейм данных ожидает 7 значений, но вы предоставляете ему нулевые значения. Хотя решение Jezrael более элегантное, вы можете внести это изменение, чтобы оно работало:

 draft2018 ="https://en.wikipedia.org/wiki/2018_NBA_draft"
draftpage =urllib.request.urlopen(draft2018)
soup=bs.BeautifulSoup(draftpage,"html.parser")

columns = ['Round', 'Pick', 'Player', 'Position',
           'Nationality', 'Team', 'School/club team']

df = pd.DataFrame(columns=columns)

table = soup.find("table",{"class":"wikitable sortable plainrowheaders"}).tbody
print(table)
trs = table.find_all("tr")

for tr in trs:
    tds = tr.find_all('td')
    row = [td.text.replace('n','') for td in tds]
    if len(row) < 7:
        continue
#     print(row)
    df = df.append(pd.Series(row, index=columns), ignore_index=True)