这是我的代码:
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)
错误似乎发生在最后一行。
答案 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
:
这就是为什么你的
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))]