AssertionError:传递22列,传递的数据有21列

时间:2016-11-28 22:59:37

标签: python

这是我的代码:

from urllib import urlopen
from bs4 import BeautifulSoup
import pandas as pd

url = "http://www.basketball-reference.com/draft/NBA_2014.html"
html = urlopen(url)
soup = BeautifulSoup(html)
column_headers = [th.getText() for th in soup.findAll('tr',limit=2)[1].findAll('th')]
data_rows = soup.findAll('tr')[2:]
player_data = [[td.getText() for td in data_rows[i].findAll('td')] for i in range(len(data_rows))] #PLAYER DATA 

type(soup)
type(data_rows)

df = pd.DataFrame(player_data,columns=column_headers)

错误似乎发生在最后一行。

1 个答案:

答案 0 :(得分:3)

首先,错误非常简单:您的column_headers列表有22列,但player_data条目只有21个。因此您需要查找缺少哪个列以及原因。只需通过直观地比较数据框和标题列表中的条目,就会看到缺少两个第一列中的一个。 player_data[0][0]返回

1, CLE, Andrew Wiggins, University of Kansas,...但它应该是

1, 1, CLE, Andrew Wiggins, University of Kansas,...

问题在于表格本身。导航到网站,将鼠标悬停在表格上并右键单击:检查。

第一行数据(在' Rk'下面)包含21个td和1个th元素。 " rk"条目实际上是th类型,而不是td

Screenshot of table of provided data

这就是为什么你的

player_data = [[td.getText() for td in data_rows[i].findAll('td')] for i in range(len(data_rows))] 

跳过第一列,因为它只迭代td个元素。因此长度不同。 我不知道第一列有多重要;快速解决方法是从标题列表中删除Rk列。

或者,搜索both td and th elements

player_data = [[td.getText() for td in data_rows[i].findAll(['td','th'])] for i in range(len(data_rows))]