属性错误:"结果集"对象没有属性"find_all" - pd.read_html



我正在尝试从网页中提取数据,但请继续收到上述错误。我已经查看了该网站上的示例以及其他网站,但没有直接处理我的问题。请参阅下面的代码:

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?

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

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

在实现相同结果的方面: dataframe = pd.read_html('url')

它是使用它或类似的实现的: dataframe = pd.read_html(url,header = 1,index_col = none)

我以前收到错误的原因是因为我没有将Spyder的Ipython Console的后端配置为"自动"。

但是,我仍然试图使用Beautifulsoup解决这个问题。因此,任何有用的评论都将不胜感激。

相关内容

  • 没有找到相关文章

最新更新