我正在使用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']]
效果很好。
答案 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).)*$')})
怎么样?