python - BeautifulSoup - wrap () - добавить элемент в несколько разделов - PullRequest
0 голосов
/ 13 ноября 2018

Как многократно вставить <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>

1 Ответ

0 голосов
/ 13 ноября 2018

вы создаете только одну оболочку и используете ее дважды.вам нужно создать два объекта, по одному для каждого заголовка.также я думаю, что вы хотите добавить еще один ".parent"

мой код:

from bs4 import BeautifulSoup

soup_2 = BeautifulSoup(open('snippet_test.html'), 'html.parser')
h2s = soup_2.find_all("h2")

for h_2 in h2s:
    wrapper = soup_2.new_tag('button', **{"class": "accordion"})
    h_2.parent.parent.parent.wrap(wrapper)

html = soup_2.prettify("utf-8")
with open("snippet.html", "wb") as file:
    file.write(html)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...