为什么我在Python中使用BeautifulSoup得到“'ResultSet'没有属性'findAll'”?

最后发布: 2009-06-14 04:41:27


问题

所以我正在慢慢地学习Python,并且我正在尝试创建一个简单的函数,它将从在线游戏的高分页面中提取数据。 这是我重写为一个函数的其他人的代码(这可能是问题),但是我收到了这个错误。 这是代码:

>>> from urllib2 import urlopen
>>> from BeautifulSoup import BeautifulSoup
>>> def create(el):
    source = urlopen(el).read()
    soup = BeautifulSoup(source)
    get_table = soup.find('table', {'id':'mini_player'})
    get_rows = get_table.findAll('tr')
    text = ''.join(get_rows.findAll(text=True))
    data = text.strip()
    return data

>>> create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13')

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    create('http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13')
  File "<pyshell#17>", line 6, in create
    text = ''.join(get_rows.findAll(text=True))
AttributeError: 'ResultSet' object has no attribute 'findAll'

提前致谢。

python urllib2 beautifulsoup
回答

哇。 Triptych为相关问题提供了很好的答案

我们可以从BeautifulSoup的源代码中看到ResultSet子类list

在您的示例中, get_rows是BS的ResultSet类的实例,
而且由于BS的ResultSet子类list ,这意味着get_rows是一个列表

get_rows ,作为一个实例ResultSet具有findAll实现的方法; 因此你的错误。
Triptych的不同之处在于迭代该列表。
Triptych的方法有效,因为get_rows列表中的项是BS的Tag类的实例; 它有一个findAll方法。

因此,要修复代码,可以使用以下方法替换create方法的最后三行:

for row in get_rows:
    text = ''.join(row.findAll(text=True))
    data = text.strip()
    print data

Leonard Richardson的注意事项:我绝不打算将其称为BS ;-)打算贬低你的工作质量