根据内部子元素过滤父<div>元素[Python]

时间:2019-03-15 04:25:27

标签: python html beautifulsoup

我有一个漂亮的汤元素结果集,其中包含几个父元素,每个父元素都包含内部元素。我将如何尝试根据每个内部元素的文本过滤这些元素。

<div class="parent">
    <div> ... <div>
    <p class="example"> TRUE </p>
</div>

在该示例中,我只想保留具有内部p元素且值为'TRUE'的元素。

3 个答案:

答案 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))'))
相关问题