web-dev-qa-db-fra.com

Comment puis-je insérer une nouvelle balise dans un objet BeautifulSoup?

Essayer de comprendre la construction html avec BS.

J'essaie d'insérer une nouvelle balise:

self.new_soup.body.insert(3, """<div id="file_history"></div>""")   

quand je vérifie le résultat, j'obtiens:

&lt;div id="file_histor"y&gt;&lt;/div&gt;

J'insère donc une chaîne qui est nettoyée pour websafe html ..

Ce que je m'attends à voir, c'est:

<div id="file_history"></div>

Comment insérer une nouvelle balise div en position 3 avec l'id file_history?

24
Jay Gattuso

Utilisez la méthode d'usine pour créer de nouveaux éléments:

new_tag = self.new_soup.new_tag('div', id='file_history')

et insérez-le:

self.new_soup.body.insert(3, new_tag)
12
Birei

Voir la documentation sur comment ajouter une balise :

soup = BeautifulSoup("<b></b>")
original_tag = soup.b

new_tag = soup.new_tag("a", href="http://www.example.com")
original_tag.append(new_tag)
original_tag
# <b><a href="http://www.example.com"></a></b>

new_tag.string = "Link text."
original_tag
# <b><a href="http://www.example.com">Link text.</a></b>
24
Guy Gavriely

D'autres réponses sont directement issues de la documentation. Voici le raccourci:

from bs4 import BeautifulSoup

temp_soup = BeautifulSoup('<div id="file_history"></div>')
# BeautifulSoup automatically add <html> and <body> tags
# There is only one 'div' tag, so it's the only member in the 'contents' list
div_tag = temp_soup.html.body.contents[0]
# Or more simply
div_tag = temp_soup.html.body.div
your_new_soup.body.insert(3, div_tag)
8
Hieu