我有一个漂亮的汤元素结果集,其中包含几个父元素,每个父元素都包含内部元素。我将如何尝试根据每个内部元素的文本过滤这些元素。
<div class="parent">
<div> ... <div>
<p class="example"> TRUE </p>
</div>
在该示例中,我只想保留具有内部p元素且值为'TRUE'的元素。
答案 0 :(得分:1)
xpath之类的声音会起作用。像
//p[contains(@class, 'example') and normalize-space(text()) = 'TRUE']/ancestor::div[@class='parent']
答案 1 :(得分:0)
BeautifulSoup允许您提供function as filter。
您可以使用lambda这样的表达式
lambda elem:elem.find('p',text=re.compile('TRUE')
在find_all()内。如果带有文本的子项不可用,这将返回一个空列表。由于any empty sequence is considered false在python中,这将过滤掉不需要的元素。
html="""
<div class="parent">
<p class="example"> TRUE </p>
</div>
<div class="parent">
<p class="example"> TRUE </p>
</div>
<div class="parent">
<p class="example">FALSE </p>
</div>
"""
from bs4 import BeautifulSoup,Tag
import re
soup=BeautifulSoup(html,'html.parser')
print(soup.find_all(lambda elem:elem.find('p',text=re.compile('TRUE'))))
输出:
[<div class="parent">
<p class="example"> TRUE </p>
</div>, <div class="parent">
<p class="example"> TRUE </p>
</div>]
答案 2 :(得分:0)
实际上,您可以使用BeautifulSoup 4.7+中的CSS选择器来完成此操作。
在这里,我们将定位每个具有直接/立即子项div
且类别为p
且包含文本example
的{{1}}。
TRUE
输出
from bs4 import BeautifulSoup,Tag
html="""
<div class="parent">
<p class="example"> TRUE </p>
</div>
<div class="parent">
<p class="example"> TRUE </p>
</div>
<div class="parent">
<p class="example">FALSE </p>
</div>
"""
soup=BeautifulSoup(html,'html.parser')
print(soup.select('div:has(> p.example:contains(TRUE))'))