Фильтрация родительских <div>элементов на основе внутренних дочерних элементов [Python] - PullRequest
1 голос
/ 15 марта 2019

У меня есть прекрасный набор результатов элемента супа, который содержит несколько родительских элементов, каждый из которых содержит внутренние элементы.Как бы я попытался отфильтровать эти элементы на основе текста каждого внутреннего элемента.

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

В примере, скажем, я хочу сохранить только те элементы, которые имеют внутренний элемент p со значением, равным'TRUE'.

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Похоже, что xpath будет работать. Что-то вроде

//p[contains(@class, 'example') and normalize-space(text()) = 'TRUE']/ancestor::div[@class='parent']
0 голосов
/ 16 марта 2019

На самом деле вы можете сделать это с помощью CSS-селекторов в BeautifulSoup 4.7 +.

Здесь мы нацеливаемся на каждый div, у которого есть прямой / непосредственный потомок p с классом example, который содержит текст 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))'))

Выход

[<div class="parent">
<p class="example"> TRUE </p>
</div>, <div class="parent">
<p class="example"> TRUE </p>
</div>]
0 голосов
/ 15 марта 2019

BeautifulSoup позволяет вам дать функцию фильтра .

Вы можете дать лямбда выражение типа

lambda elem:elem.find('p',text=re.compile('TRUE')

внутри find_all () .Если ребенок с текстом недоступен, он вернет пустой список.Так как любая пустая последовательность считается ложной в 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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...