Я предполагаю, что вы можете найти первый тег <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()))