Beautiful Soup 的 Python 正则表达式

Posted

技术标签:

【中文标题】Beautiful Soup 的 Python 正则表达式【英文标题】:Python regular expression for Beautiful Soup 【发布时间】:2012-11-27 11:42:01 【问题描述】:

我在用Beautiful Soup 拉出特定的div 标签,好像不能用 简单的字符串匹配。

页面有一些标签形式为

<div class="comment form new"...> 

我想忽略的,还有一些

形式的标签
<div class="comment comment-xxxx..."> 

其中 x 表示任意长度的整数,省略号表示任意数量的其他值,由空格分隔(我不关心)。我无法弄清楚 正确的正则表达式,特别是因为我从未使用过 python 的 re 类。

使用

soup.find_all(class_="comment") 

查找以单词comment 开头的所有标签。我试过使用

soup.find_all(class_=re.compile(r'(comment)( )(comment)'))
soup.find_all(class_=re.compile(r'comment comment.*'))

还有许多其他变体,但我认为我在这里遗漏了一些关于正则表达式或 match() 如何工作的明显内容。谁能帮帮我?

【问题讨论】:

首先,您使用的是BS3还是BS4?一个有findAll,一个有find_all,一个都没有findall... 抱歉,BS4 - 我没有直接从我的代码中粘贴,将编辑。 该死,因为我有 BS3 的答案……但对于 BS4,它看起来不喜欢课堂上的空格?或者也许我只是不太了解 BS4。我可以匹配'comment',但不能匹配'comment comment'。我会调查的。 【参考方案1】:

我想我明白了:

>>> [div['class'] for div in soup.find_all('div')]
[['comment', 'form', 'new'], ['comment', 'comment-xxxx...']]

请注意,与 BS3 中的等价物不同,它不是这样的:

['comment form new', 'comment comment-xxxx...']

这就是你的正则表达式不匹配的原因。

但你可以匹配,例如,这个:

>>> soup.find_all('div', class_=re.compile('comment-'))
[<div class="comment comment-xxxx..."></div>]

请注意,BS 相当于 re.search,而不是 re.match,因此您不需要 'comment-.*'。当然,如果你想匹配 'comment-12345' 而不是 'comment-of-another-kind,你会想要,例如 'comment-\d+'

【讨论】:

我记得在 BS4 文档中读过一些关于此的内容,但它仍然违反直觉。非常感谢!我为此打了一个多小时。 @user1890572:我不知道为什么,但除了快速的第三方“从 BS3 迁移”指南之外,我还没有通读 BS4 文档,所以我已经习惯了糊涂通过我自己的代码中的此类问题。想一想,如果我再聪明一点,我就无法回答了。 :)

以上是关于Beautiful Soup 的 Python 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

python之Beautiful Soup库

python 爬虫学习--Beautiful Soup插件

python 之beautiful soup 4 warning

python beautiful soup库的超详细用法

python之Beautiful Soup的基本用法

Python Beautiful Soup 解析库的使用