看似简单的python正则表达式不匹配

2024-06-24 13:12:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用BeautifulSoup(python)的find\u all函数和regex来从网页上刮取一些数据。非常明确地说,我正在从here中删除单个分类广告。如果检查每个分类广告,可以看到它们通常封装在以下任何一个div中:

<div class="item c-b-#">...</div>

或者

<div class="item c-b-# premium">...</div>

其中#是一个数字(通常为0或2)。你知道吗

我的目标是用正则表达式来区分这两个。以下是我所做的:

regularAds = soup.find_all('div', attrs={'class': re.compile('item.*')})

以及

premiumAds = soup.find_all('div', attrs={'class': re.compile('item.*premium')})

前者像expeced一样工作-它返回所有分类广告(包括溢价),但后者不返回任何内容。怎么了?为什么'item.*premium'不映射到第二个div类?你知道吗

作为第二个问题:我将如何修改第一个regex来表示“我想要所有有'item'这个词但没有'premium'这个词的正则表达式?”?你知道吗

编辑

供将来参考:经过一番反复试验,我的第二个问题的答案变成了:

regularAds = [tag for tag in soup.find_all('div', attrs={'class': re.compile('item')}) if 'premium' not in tag['class']]

效果不错。你知道吗


Tags: indivretagallfinditemattrs
2条回答

奇怪的idd作为你的第二个正则表达式肯定会起作用:

>>> soup = BeautifulSoup('<div class="item c-b-#">text1</div><div class="item c-b-# premium">text2</div>')
>>> soup.findAll('div', attrs={'class': re.compile('item.*premium')})
[<div class="item c-b-# premium">text2</div>]

最后一个问题soup.findAll('div', attrs={'class': re.compile('^item((?!premium).)*$')})怎么样。你知道吗

我的快速猜测是,beautiful soup中的class基本上是对class属性的实际文本调用class.split(' ')的结果。如果你做了:

premiumAds = soup.find_all('div', attrs={'class': 'premium'})

相关问题 更多 >