【问题标题】:Seemingly simple python regex does not match看似简单的python正则表达式不匹配
【发布时间】:2014-03-25 19:47:29
【问题描述】:

我正在使用 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']]

效果很好。

【问题讨论】:

    标签: python regex beautifulsoup


    【解决方案1】:

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

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

    【讨论】:

    • 哇...成功了!我永远不会猜到。我认为有点奇怪的行为。也不完全直观,但它解释了很多(我之前曾遇到过一些类似的问题)。谢谢!
    • 很高兴它有帮助!我认为这样做类似于classList
    【解决方案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).)*$')})怎么样。

    【讨论】:

    • 我很确定正则表达式本身是正确的,但请参阅。上面@sam 的建议,类属性在''上拆分,因此几乎可以缩小范围。您的正则表达式工作正常;返回与.*item.* 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多