1

我想我正在尝试用 BeautifulSoup (BS4) 编写我的第一个解析器并遇到一个概念问题。我在 Python 方面做得不多——我在 PHP 方面做得更好。

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

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

我尝试浏览示例代码如何使用 urllib2 从 Python 中打开的 url 中提取特定数据?并得到或多或少相同的错误(注意:如果你想尝试它,你需要一个有效的 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 对象?

4

1 回答 1

3

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

如果不查看更多代码或不知道您尝试抓取的实际站点,很难提供一个完全准确的示例,但我会尽力而为。

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

您应该再编写一个迭代代码。(我假设有带有s 的td标签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)

这会将整个表格内容返回到单个字符串中。text您可以通过简单地更改 和 的位置text_list来优化 的值text =

这可能看起来比所需的代码更多,这可能是真的,但我发现当我以这种方式进行时,我的刮擦会更加彻底和准确。

于 2012-10-16T18:36:27.787 回答