Answer the question
In order to leave comments, you need to log in
How to link unrelated tags via bs4?
The article has sections. The code itself is solid tags, that is, the sections are not marked with classes, they are not wrapped, in general they are not separated in any way. Through bs4 I am trying to parse the code and get semantic blocks - that is, on the condition of checks, write the first h2 into a variable, say, section 1, the paragraphs after it into the variable content of section 1, and when the second h2 appears on the horizon, do everything the same, only write it down data to the variable section 2. Is it possible to implement similar logic at the bs4 level?
Example:
<h2>Заголовок раздела</h2>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<p>Какой-то контент</p>
<h2>Другой заголовок раздела</h2>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
<p>Опять какой-то контент</p>
Answer the question
In order to leave comments, you need to log in
If all this beauty lies in one parent (well, or you can put it all in one list in the correct order), then it is trivial.
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) )
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')
# далее по вкусу
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question