使用 BeautifulSoup 排除 findAll 的不需要的结果

Posted

技术标签:

【中文标题】使用 BeautifulSoup 排除 findAll 的不需要的结果【英文标题】:Excluding unwanted results of findAll using BeautifulSoup 【发布时间】:2013-10-21 12:07:47 【问题描述】:

使用 BeautifulSoup,我的目标是抓取与此 html 挂钩相关的文本:

<p class="review_comment">

所以,使用如下简单代码,

content = page.read()  
soup = BeautifulSoup(content)  
results = soup.find_all("p", "review_comment")

我很乐意解析这里的文本:

<p class="review_comment">
    This place is terrible!</p>

坏消息是,soup.find_all 每 30 次左右匹配一次,它还会匹配并抓取一些我真的不想要的东西,这是用户更新后的旧评论:

<p class="review_comment">
    It's 1999, and I will always love this place…  
<a href="#" class="show-archived">Read more &raquo;</a></p>

在尝试排除这些旧的重复评论时,我尝试了各种想法。

我一直在尝试更改我的soup.find_all() 调用中的参数 明确排除出现在 <a href="#" class="show-archived">Read more &raquo;</a> 之前的任何文本 我陷入了正则表达式类型匹配的困境,但没有成功。 我似乎无法利用 class="show-archived" 属性。

任何想法将不胜感激。提前致谢。

【问题讨论】:

在“坏消息匹配”中,您不想要的只是内部A标签和内容还是要拒绝整个P? 是的,“坏消息匹配”是一个旧评论,我想拒绝整个事情。造成这种情况的一个主要原因是,我还抓取了“# of stars”信息,但突然间我的评论比星星还多。 你知道在soup.find()中拼写class_的特殊方法吗? 【参考方案1】:

这就是你想要的吗?

for p in soup.find_all("p", "review_comment"):
    if p.find(class_='show-archived'):
        continue
    # p is now a wanted p

【讨论】:

这是我需要使用的策略,是的。使用正确的循环是一件简单的事情。感谢您的帮助@msw!

以上是关于使用 BeautifulSoup 排除 findAll 的不需要的结果的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 在 findAll 中排除标签

BeautifulSoup 排除特定标签内的内容

在 Beautifulsoup Python 上排除不需要的标签

蒲公英 · JELLY技术周刊 Vol.05: Rust & Electron 的高性能实践 -- Finda

蒲公英 · JELLY技术周刊 Vol.05: Rust & Electron 的高性能实践 -- Finda

PyCharm 2017.1,没有名为“kivy”的模块