使用正则表达式在Beautiful Soup中查找标签?

36 投票
3 回答
100417 浏览
提问于 2025-04-18 13:20

我真的希望能够让Beautiful Soup匹配任何标签列表,比如这样。我知道attr可以接受正则表达式,但在Beautiful Soup中有没有什么方法可以做到这一点呢?

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

输出:

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

我的目标是创建一个抓取工具,可以从网站上提取表格。有时候标签的命名不一致,我希望能够输入一个标签列表来指定表格中“数据”部分的标签。

3 个回答

7

是的,可以查看文档...

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

import re

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

请注意,你也可以使用正则表达式来在标签的属性中进行搜索。举个例子:

import re
from bs4 import BeautifulSoup

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

这个例子会找到所有链接到包含字符串 'crummy.com' 的网站的 <a> 标签。

55

find_all() 是 Beautiful Soup 搜索 API 中最常用的方法。

你可以传入不同的过滤条件。此外,还可以传入一个列表来查找多个标签:

>>> 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>]

或者你可以使用正则表达式来查找包含 adiv 的标签:

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

撰写回答