Красивый суп, возвращающий узлы p после узла - PullRequest
0 голосов
/ 25 мая 2018

Я использую Python 3.6 и beautfulsoup4

У меня есть первый узел:

title = self.html.find(id=(lists[1][selectionindex]))

это не один и этот узел выделен красным цветом:

image

Как получить список узлов в синем (любые узлы div / p), но остановиться, когда он доберется до h1 / 2/3узел

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я предполагаю, что вы можете найти первый тег <h3> с использованием некоторого id (как показано в вашем коде).Следующий код получит все теги <p> и <div> после тега <h3> и остановится при обнаружении тега <h1>, <h2> или <h3>.

html = '''
<p>unwanted</p>
<h3 id="special">some text</h3>
<div class="foo">wanted</div>
<p>wanted</p>
<p>wanted</p>
<p>wanted</p>
<h2>some text</h2>'''

soup = BeautifulSoup(html, 'html.parser')

list_of_wanted_tags = []
starting_tag = soup.find('h3', id='special')

for tag in starting_tag.find_all_next():
    if tag.name in ('div', 'p'):
        list_of_wanted_tags.append(tag)
    elif tag.name in ('h1', 'h2', 'h3'):
        break

print(list_of_wanted_tags)
# [<div class="foo">wanted</div>, <p>wanted</p>, <p>wanted</p>, <p>wanted</p>]

Метод find_all_next() возвращает список всех тегов, следующих за текущим тегом.


Если вы хотите, чтобы все теги были между двумя такимитеги, а не только теги <p> и <div>, используйте это:

for tag in starting_tag.find_all_next():
    if tag.name in ('h1', 'h2', 'h3'):
        break
    list_of_wanted_tags.append(tag)

или то же самое, используя itertools.takewhile:

wanted = list(itertools.takewhile(lambda tag: tag.name not in ('h1', 'h2', 'h3'), start.find_all_next()))
0 голосов
/ 25 мая 2018

Вы можете использовать функцию find_all BeautifulSoup, чтобы получить все экземпляры определенного тега HTML.

import requests, lxml
from bs4 import BeautifulSoup

r = requests.get('https://www.google.co.uk')
soup = BeautifulSoup(r.content, "lxml")

f = soup.find_all("p")

for p in f:
    print p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...