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 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章