与列数相关的断言错误

时间:2018-03-24 03:20:55

标签: python for-loop web-scraping

我收到一个断言错误,说已经传递了20列,但传递的数据有50列。我知道是什么导致了这个错误,但现在已经很晚了,我不确定如何修复它 - 问题是真的有20个列标题,但50个数字来自行数。我认为它可能与循环有关,但任何帮助都会受到赞赏,因为我想这很简单,但我不太确定如何解决它。

from bs4 import BeautifulSoup
import requests
import pandas as pd
import time

playerData = []

for i in range(6):
    initialURL = 'https://www.fangraphs.com/leaders.aspx?pos=all&stats=sta&lg=all&qual=0&type=8&season=2017&month=0&season1=2017&ind=0&team=0&rost=0&age=0&filter=&players=0&sort=7,d&page=' + str(i) +'_50'
    r = requests.get(initialURL)
    soup = BeautifulSoup(r.text, 'html.parser')
    statistics = soup.find("table", {"class" : "rgMasterTable"})
    statistics.findAll('th')
    column_headers = [th.getText() for th in soup.findAll('th')]
    data = statistics.findAll('tr')[3:]
    pitcherStatistics = [[td.text.strip() for td in data[a].findAll('td')]
                          for a in range(len(data))]
    playerData.append(pitcherStatistics)


print(playerData)

df = pd.DataFrame(playerData, columns=column_headers)
df.to_csv("Starting Pitchers.csv", index=False)

1 个答案:

答案 0 :(得分:0)

看起来playerData是3D,但DataFrame只是2D。我想你的问题是你在每个"行"中使用了3 tr个元素。当只有1可以适合。您需要保留playerData 2D,可能是单独添加三个tr元素,而不是作为子列表。