BeautifulSoup 在 findAll 中排除标签

Posted

技术标签:

【中文标题】BeautifulSoup 在 findAll 中排除标签【英文标题】:BeautifulSoup exclude a tag in findAll 【发布时间】:2020-12-02 22:44:38 【问题描述】:

在 beautifulsoup 中,我们如何在使用 findAll 时排除特定标签中的标签。

让我们考虑这个例子,我想在html中找到所有<p>标签,除了

<tr> 标签内的标签。

soup.findAll(['p'])

以上代码将获取所有<p> 标签,但我需要排除<tr> 标签中的<p> 标签。

【问题讨论】:

【参考方案1】:

您可以使用.select。示例:选择所有<p> 标记,但排除<tr> 标记中的<p> 标记。

soup.select('p:not(tr > p)')

选择所有<p>标签,但排除属于<tr>标签子级的<p>标签

soup.select('p:not(tr p)')

选择所有 <p><h2>tags,但排除 <p>tags 是 <tr> 的子标签

soup.select('p,h2:not(tr p)')

【讨论】:

感谢您的回复。我该怎么做才能使用多个选择器?例如我需要同时使用 P 和 h2 标签。 您只需添加一个逗号。我也为此添加了一个示例。 可以添加html示例吗?【参考方案2】:

如果我理解正确,您想在任何级别选择所有没有tr 作为父级的p

您可以选择所有p,然后使用findParent 函数过滤结果。 findParent 将返回具有给定标签名称的第一个父级,否则 None

from bs4 import BeautifulSoup

html = """
  <tr>
    <p>1</p>
  </tr>
  
  <tr>
    <td>
      <p>2</p>
    </td>
  </tr>
  
  <p>3</p>
  
  <div>
    <p>4</p>
  </div>
"""

soup = BeautifulSoup(html, "html.parser")
print([p for p in soup.findAll('p') if not p.findParent('tr')])

【讨论】:

以上是关于BeautifulSoup 在 findAll 中排除标签的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup:抓取蒸汽愿望清单游戏 - .findAll 不返回在检查器中可见的嵌套 div

为啥我在 Python 中使用 BeautifulSoup 得到“'ResultSet' 没有属性 'findAll'”?

BeautifulSoup 中“findAll”和“find_all”的区别

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

BeautifulSoup库findAll()find()方法详解

Beautifulsoup findall