Как многократно вставить <button class="accordion"> </button>
У меня есть код ниже, где я хочу добавить кнопку к каждому заголовку, используя функцию переноса из библиотеки beautifulsoap.
Я пытаюсь перебрать объекты h2, найти родительские 3 уровня вверх от каждой строки заголовка и вставить тег кнопки. Однако логика не работает с функцией переноса. Одна кнопка размещается для двух заголовков, и структура кода изменяется.
Кто-нибудь может объяснить здесь механику функции обтекания / исправить логику, пожалуйста?
Input
<html>
<body>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Header-1">
Header 1
<a class="anchor-link" href="#Header-1">
</a>
</h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p TEXT_1
</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Header-2">
Header 2
<a class="anchor-link" href="#Header-1">
</a>
</h2>
</div>
</div>
</div>
</body>
</html>
Код:
from bs4 import BeautifulSoup
soup_2 = BeautifulSoup(open('snippet_test.html'), 'html.parser')
h2s = soup_2.find_all("h2")
wrapper = soup_2.new_tag('button', **{"class": "accordion"})
for h_2 in h2s:
h_2.parent.parent.wrap(wrapper)
html = soup_2.prettify("utf-8")
with open("snippet.html", "wb") as file:
file.write(html)
Вывод (неправильно введена только одна кнопка, неожиданные изменения в коде):
<html>
<body>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p <="" p="" text_1="">
</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<button class="accordion">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Header-1">
Header 1
<a class="anchor-link" href="#Header-1">
</a>
</h2>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Header-2">
Header 2
<a class="anchor-link" href="#Header-1">
</a>
</h2>
</div>
</div>
</button>
</div>
</body>
</html>
Желаемый выход:
<html>
<body>
<button class="accordion" >
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Header-1">
Header 1
<a class="anchor-link" href="#Header-1">
</a>
</h2>
</div>
</div>
</div>
</button>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p TEXT_1
</p>
</div>
</div>
</div>
<button class="accordion" >
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="Header-2">
Header 2
<a class="anchor-link" href="#Header-1">
</a>
</h2>
</div>
</div>
</div>
</button>
</body>
</html>