Meys313
@Meys313

Как связать несвязанные друг с другом теги через bs4?

В статье идут разделы. Сам код представляет из себя сплошные теги, то есть разделы не обозначены классами, не обернуты, в общем никак не разделены. Через bs4 пытаюсь разобрать код и получить семантические блоки - то есть на условии проверок записать первый h2 в переменную, скажем, раздел 1, параграфы за ним в переменную контент раздела 1, а когда на горизонте появится второй h2 сделать всё тоже самое, только уже записывать данные в переменную раздел 2. Возможно ли реализовать подобную логику на уровне bs4?
Пример:
<h2>Заголовок раздела</h2>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<p>Какой-то контент</p>

<h2>Другой заголовок раздела</h2>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
  • Вопрос задан
  • 29 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Если вся эта красота лежит в одном родителе (ну или ты можешь засунуть всё это в один список в правильном порядке), то тривиально.
sections = []
current_section = None
paragraphs = []
for tag in tags: # перебираем теги, которые надо обработать
    if tag.name == 'h2':
        if current_section is not None:
            sections.append( (current_section, paragraphs) )
        current_section = tag
        paragraphs = []
    elif tag.name == 'p':
        paragraphs.append(tag)
if current_section is not None:
    sections.append( (current_section, paragraphs) )

В secitons будет лежать список кортежей вида (заголовок, список параграфов) в том порядке, в котором они идут в тексте. Твоя забота - обеспечить правильное значение tags.
Ответ написан
Комментировать
@AVKor
from bs4 import BeautifulSoup

OLD_DOC = '''
<html>
<body>
<h2>Заголовок раздела</h2>
<p>Какой-то контент 1</p>
<p>Какой-то контент 2</p>
<p>Какой-то контент 3</p>
<p>Какой-то контент 4</p>
<p>Какой-то контент 5</p>

<h2>Другой заголовок раздела</h2>
<p>Опять какой-то контент 1</p>
<p>Опять какой-то контент 2</p>
<p>Опять какой-то контент 3</p>
<p>Опять какой-то контент 4</p>
<p>Опять какой-то контент 5</p>

<h2>Ещё один заголовок раздела</h2>
<p>Ещё один какой-то контент 1</p>
<p>Ещё один какой-то контент 2</p>
<p>Ещё один какой-то контент 3</p>
<p>Ещё один какой-то контент 4</p>
<p>Ещё один какой-то контент 5</p>
</body>
</html>
'''

NEW_DOC = ''
part_start = OLD_DOC.rfind("<h2>")
while part_start != -1:
    part_stop = OLD_DOC.find('</body>')
    part = OLD_DOC[part_start:part_stop].strip()
    NEW_DOC = f'<div>\n{part}\n</div>\n{NEW_DOC}'
    OLD_DOC = OLD_DOC.replace(part,"")
    part_start = OLD_DOC.rfind("<h2>")

soup = BeautifulSoup(NEW_DOC, 'lxml')
data = soup.find_all('div')
# далее по вкусу
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы