【问题标题】:AttributeError: 'ResultSet' object has no attribute 'find_all' - pd.read_htmlAttributeError: 'ResultSet' 对象没有属性 'find_all' - pd.read_html
【发布时间】:2017-04-25 07:15:52
【问题描述】:

我正在尝试从网页的表格中提取数据,但一直收到上述错误。我查看了该站点上的示例以及其他示例,但没有一个直接涉及我的问题。请看下面的代码:

from bs4 import BeautifulSoup

import requests

import pandas as pd

url = 'http://www.espn.com/nhl/statistics/player/_/stat/points/sort/points/year/2015/seasontype/2'

r = requests.get(url)

data = r.text

soup = BeautifulSoup(data, "lxml")

table = soup.find_all('table', class_='dataframe')

rows = table.find_all('tr')[2:]

data = {
    'RK' : [],
    'PLAYER' : [],
    'TEAM' : [],
    'GP' : [],
    'G' : [],
    'A' : [],
    'PTS' : [],
    '+/-' : [],
    'PIM' : [],
    'PTS/G' : [],
    'SOG' : [],
    'PCT' : [],
    'GWG' : [],
    'G1' : [],
    'A1' : [],
    'G2' : [],
    'A2' : []
}

for row in rows:
    cols = row.find_all('td')
    data['RK'].append( cols[0].get_text() )
    data['PLAYER'].append( cols[1].get_text() )
    data['TEAM'].append( cols[2].get_text() )
    data['GP'].append( cols[3].get_text() )
    data['G'].append( cols[4].get_text() )
    data['A'].append( cols[5].get_text() )
    data['PTS'].append( cols[6].get_text() )
    data['+/-'].append( cols[7].get_text() )
    data['PIM'].append( cols[8].get_text() )
    data['PTS/G'].append( cols[9].get_text() )
    data['SOG'].append( cols[10].get_text() )
    data['PCT'].append( cols[11].get_text() )
    data['GWG'].append( cols[12].get_text() )
    data['G1'].append( cols[13].get_text() )
    data['A1'].append( cols[14].get_text() )
    data['G2'].append( cols[15].get_text() )
    data['A2'].append( cols[16].get_text() )

df = pd.DataFrame(data)

df.to_csv("NHL_Players_Stats.csv")

我已经消除了这个错误,因为看到错误是指没有方法 find_all 的表(即结果集)并通过注释掉以下行来运行代码:

#rows = table.find_all('tr')[2:]

并改变这个:

for row in rows:

但是,这不会从网页中提取任何数据,而只是创建一个带有列标题的 .csv 文件。

我尝试使用soup.find_all 将一些数据直接提取到行中,但出现以下错误;

    data['GP'].append( cols[3].get_text() )
IndexError: list index out of range

我无法解决。

因此,非常感谢任何帮助。

此外,出于好奇,是否有任何方法可以使用以下方法实现预期结果:

dataframe = pd.read_html('url')

因为,我也试过这个,但请继续保持:

FeatureNotFound: Couldn't find a tree builder with the features you
requested: html5lib. Do you need to install a parser library?

理想情况下,这是我更喜欢的方法,但在网上找不到任何示例。

【问题讨论】:

  • 找不到html5lib?好吧,你走了:)
  • @TemporalWolf,是的,情况似乎如此。但是,当我将它与 BeautifulSoup() 方法一起使用时,它似乎找到了它。有什么建议? :)

标签: python dataframe bs4 html5lib


【解决方案1】:

find_all 返回一个ResultSet,它基本上是一个元素列表。因此,它没有方法find_all,因为这是一个属于单个元素的方法。

如果您只想要一张桌子,请使用find 而不是find_all 来查找它。

table = soup.find('table', class_='dataframe')

然后,获取它的行应该像你已经完成的那样工作:

rows = table.find_all('tr')[2:]

您遇到的第二个错误是,由于某种原因,表格的某一行似乎只有 3 个单元格,因此您的 cols 变量变成了一个只有索引 0、1 和 2 的列表。这就是为什么 cols[3]给你一个IndexError

【讨论】:

  • 感谢 cmets。我确实尝试了你的建议,但第二行:rows = table.find_all 仍然抛出该错误,即使第一行更改为 table = soup.find(.....)。关于似乎有道理的第二个错误。因此,如果我从行(1)而不是行(0)开始提取会更好吗?这是导致问题的原因?
【解决方案2】:

为了达到相同的结果,使用: 数据框 = pd.read_html('url')

仅使用该方法或类似方法即可实现: dataframe = pd.read_html(url, header=1, index_col=None)

我之前收到错误的原因是因为我没有在“首选项”中将 Spyder 的 iPython 控制台后端配置为“自动”。

不过,我仍在尝试使用 BeautifulSoup 解决此问题。因此,任何有用的 cmets 将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2018-08-06
    • 1970-01-01
    • 2016-12-19
    • 2013-03-30
    • 1970-01-01
    • 2014-10-23
    • 2020-03-11
    相关资源
    最近更新 更多