如何使用BeautifulSoup查找一个表中的所有行

时间:2012-10-16 15:09:25

标签: python web-scraping beautifulsoup

我想尝试使用BeautifulSoup(BS4)编写我的第一个解析器并遇到一个概念问题。我对Python没有太多帮助 - 我在PHP方面做得更好。

我可以让BeautifulSoup找到我想要的表格,但是当我尝试进入表格并找到所有行时,我会得到一些变化:

AttributeError: 'ResultSet' object has no attribute 'attr'

我尝试在How do I draw out specific data from an opened url in Python using urllib2?处查看示例代码,并且或多或少地犯了相同的错误(注意:如果您想尝试它,则需要working URL。)

我正在阅读的一些内容说问题是ResultSet是一个列表。我怎么知道的?如果我print type(table)它只是告诉我<class 'bs4.element.ResultSet'>

我可以在表格中找到文字:

for row in table:
    text = ''.join(row.findAll(text=True))
    print text

但如果我尝试使用以下方式搜索HTML:

for row in table:
    text = ''.join(row.find_all('tr'))
    print text

它抱怨expected string, Tag found那么我如何将这个字符串(这是一个充满HTML的字符串)重新组合成一个我可以解析的beautifulsoup对象?

1 个答案:

答案 0 :(得分:3)

BeautifulSoup数据类型至少可以说是奇怪的。很多时候,他们没有提供足够的信息来轻松拼凑拼图。我知道你的痛苦!无论如何......我的答案......

很难提供一个完全准确的例子而不会看到更多的代码,或者知道你试图抓住的实际网站,但我会尽我所能。

问题在于你''.join().findAll('tr')返回BeautifulSoup数据类型“tag”的元素列表。它知道BS如何找到tr。因此,您将错误的数据类型传递给''.join()

您应该再编码一次迭代。 (我假设有td s tr个标签

text_list = []
for row in table:
    table_row = row('tr')
    for table_data in table_row:
        td = table_data('td')
        for td_contents in td:
            content = td_contents.contents[0]
            text_list.append(content)
text = ' '.join(str(x) for x in text_list)

这会将整个表内容返回到单个字符串中。您只需更改texttext_list的位置即可优化text =的值。

这可能看起来比需要的代码更多,这可能是真的,但是当我这样做的时候,我发现我的擦伤更加彻底和准确。