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 的不需要的结果