5

我正在使用 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() 如何工作的明显内容。谁能帮我吗?

4

1 回答 1

15

我想我明白了:

>>> [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, not re.match,所以你不需要'comment-.*'。当然,如果你想匹配'comment-12345'但不是'comment-of-another-kind你想要的,例如,'comment-\d+'.

于 2012-12-10T03:50:00.953 回答