【问题标题】:Webscraping using BS4 - "Length of passed values is 0, index implies 7"使用 BS4 进行网页抓取 - “传递值的长度为 0,索引意味着 7”
【发布时间】:2019-07-26 17:55:09
【问题描述】:

我得到一个错误,传递值的长度为 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)

有人可以解释这背后的原因吗?

【问题讨论】:

    标签: python pandas beautifulsoup


    【解决方案1】:

    使用read_html 作为DataFrames 的返回列表并选择4. DataFrame by indexing [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.)  
    

    【讨论】:

    • 为什么是索引[3]?
    • @MohitMotwani - 它是数据帧列表中的 4.DataFrame
    • @MohitMotwani - 完全正确。
    • 哦,有道理。谢谢!
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2020-11-09
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      相关资源
      最近更新 更多