【问题标题】:Assertion Error related to number of columns与列数相关的断言错误
【发布时间】:2018-09-02 19:01:26
【问题描述】:

我收到一个断言错误,说通过了 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)

【问题讨论】:

标签: python python-3.x pandas for-loop web-scraping


【解决方案1】:

看起来playerData 是 3D,但 DataFrame 只是 2D。我猜你的问题是你在每个“行”中使用 3 个 tr 元素,而只有 1 个元素可以容纳。您需要保持playerData 2D,也许通过单独附加三个tr 元素而不是作为子列表。

【讨论】:

  • 我不太确定我是否正在关注该问题或如何解决它。我不想让 playerData 成为 3D,也不想在每行中使用 3 个 tr 元素。
  • 你看到playerData 是一个列表列表吗?那是3D。它应该是列表的列表,即 2D。
  • 我还是个新手,所以对我需要做些什么来修复它有任何帮助吗?我基本上只想要一个包含网站前 5 页的列标题和玩家数据的数据框。
  • 我修复了部分问题,但创建了一个新问题。我抓了 playerData List 并告诉数据框获取 pitcherStatistics 数据。但是,当我这样做时,现在它只输出第 5 页的玩家而不是全部 5。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多