美丽的汤使用正则表达式来查找标签?

时间:2014-07-15 01:05:55

标签: python regex web-scraping

我真的希望能够让Beautiful Soup匹配任何标签列表,就像这样。我知道attr接受正则表达式,但是有什么美丽的汤可以让你这样做吗?

soup.findAll("(a|div)")

输出:

<a> ASDFS
<div> asdfasdf
<a> asdfsdf

我的目标是创建一个可以从网站抓取表格的刮刀。有时标签的名称不一致,我希望能够输入一个标签列表来命名数据&#39;表的一部分。

3 个答案:

答案 0 :(得分:32)

find_all()是Beautiful Soup搜索API中最受青睐的方法。

您可以传递各种过滤器。另外,传递list以查找多个标记:

>>> soup.find_all(['a', 'div']) 

示例

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<html><body><div>asdfasdf</div><p><a>foo</a></p></body></html>')
>>> soup.find_all(['a', 'div'])
[<div>asdfasdf</div>, <a>foo</a>]

或者您可以使用regular expression查找包含adiv的代码:

>>> import re
>>> soup.find_all(re.compile("(a|div)"))

答案 1 :(得分:28)

请注意,您还可以使用正则表达式搜索标记属性中的 。例如:

import re
from bs4 import BeautifulSoup

soup.find_all('a', {'href': re.compile(r'crummy\.com/')})

此示例查找链接到包含子字符串<a>的网站的所有'crummy.com'标记。

(我知道这是一篇非常古老的帖子,但希望有人会发现这些附加信息很有用。)

答案 2 :(得分:3)

是的,请参阅文档...

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

import re

soup.findAll(re.compile("^a$|(div)"))