python - html- вставка родственного элемента, содержащего вложенные теги - PullRequest
0 голосов
/ 15 ноября 2018

Как вставить элемент, содержащий вложенные теги?

Я пытаюсь использовать функцию insert_before, но, похоже, это работает только для одного тега.Например, имея

<html>
  <body>
    <div class= first_class>
    <h1 id=Heder1>Header1</h1>
    </div>
  </body>
</html>

, я пытаюсь вставить над каждым <div class= first_class>

 <button class="accordion">
  <div class="preface">
    <i>Text</i>
  </div>
  </button>

Я пытаюсь использовать приведенную ниже логику, но она не работает должным образом.Раздел не вставляется.

section_code = BeautifulSoup('<button class="accordion"><div class="preface"><i>Text</i></div></button>', 'lxml')

section = section.html.body.contents[0]

titels = soup.find_all("h1")

for title in titels:
    title.parent.insert_before(section)

Как этого достичь?

Желаемый вывод

<html>
  <body>
    <button class="accordion">
      <div class="preface">
        <i>Text</i>
      </div>
    </button>
    <div class= first_class>
    <h1 id=Heder1>Header1</h1>
    </div>
  </body>
</html>

1 Ответ

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

Вам просто нужно сделать немного больше. Если вы вставите как str вместо bs4.element.Tag. Строка будет HTML кодировать

from bs4 import BeautifulSoup

html = """
<html>
  <body>
    <div class= first_class>
    <h1 id=Heder1>Header1</h1>
    </div>
  </body>
</html>

"""

insert = """

<button class="accordion"><div class="preface"><i>Text</i></div></button>
"""
insert_content = BeautifulSoup(insert,"lxml")
soup = BeautifulSoup(html,"lxml")

title = soup.find("div")

title.insert_before(insert_content.find("button"))
print(soup.prettify())

выход

<html>
 <body>
  <button class="accordion">
   <div class="preface">
    <i>
     Text
    </i>
   </div>
  </button>
  <div class="first_class">
   <h1 id="Heder1">
    Header1
   </h1>
  </div>
 </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...