我想尝试使用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对象?
答案 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)
这会将整个表内容返回到单个字符串中。您只需更改text
和text_list
的位置即可优化text =
的值。
这可能看起来比需要的代码更多,这可能是真的,但是当我这样做的时候,我发现我的擦伤更加彻底和准确。