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

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

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

<tr> 标签内的标签。

soup.findAll(['p'])

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

【问题讨论】:

    标签: python html beautifulsoup lxml


    【解决方案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')])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多