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

时间:2014-03-25 19:47:30

标签: python regex beautifulsoup

我正在使用BeautifulSoup的(python)find_all函数和正则表达式从网页上删除一些数据。具体而言,我正在从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')})

前者按预期工作 - 它返回所有分类(包括溢价),但后者不返回任何内容。这有什么问题?为什么'item.*premium'没有映射到第二个div类?

作为第二个问题:我如何改变第一个正则表达式,说“我希望所有那些包含'item'而不是单词'premium'的人?

修改

供将来参考:经过一些试验和错误后,我的第二个问题的答案变为:

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

效果很好。

2 个答案:

答案 0 :(得分:0)

我的快速猜测是来自美丽汤的class基本上是在类属性的实际文本上调用class.split(' ')的结果。如果你这样做了:

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

答案 1 :(得分:0)

奇怪的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).)*$')})怎么样?