Modification de la valeur de l'élément avec BeautifulSoup renvoie élément vide
-
22-08-2019 - |
Question
from BeautifulSoup import BeautifulStoneSoup
xml_data = """
<doc>
<test>test</test>
<foo:bar>Hello world!</foo:bar>
</doc>
"""
soup = BeautifulStoneSoup(xml_data)
print soup.prettify()
make = soup.find('foo:bar')
print make
# prints <foo:bar>Hello world!</foo:bar>
make.contents = ['Top of the world Ma!']
print make
# prints <foo:bar></foo:bar>
Comment puis-je modifier le contenu de l'élément, dans ce cas, l'élément dans la variable « faire », sans perdre le contenu? Si vous pouviez me pointer vers d'autres modules purs python Wich peuvent modifier des documents XML existants, s'il vous plaît laissez-moi savoir.
PS! BeautifulSoup est idéal pour screenscraping et l'analyse syntaxique du HTML et XML!
La solution
Consultez la documentation replaceWith . Cela fonctionne:
make.contents[0].replaceWith('Top of the world Ma!')
Autres conseils
En utilisant la version BeautifulSoup 4 (bs4
), vous pouvez obtenir le même par mise à jour des biens de string
directement:
from bs4 import BeautifulSoup
xml_data = """
<doc>
<test>test</test>
<foo:bar>Hello world!</foo:bar>
<parent>Hello <child>world!</child></parent>
</doc>
"""
soup = BeautifulSoup(xml_data)
make = soup.find('foo:bar')
make.string = 'Top of the world Ma!'
print make
# prints <foo:bar>Top of the world Ma!</foo:bar>
Cette approche fonctionne bien pour le cas où l'élément contient d'autres éléments, et que vous voulez remplacer le contenu entier par un nouveau:
parent = soup.find('parent')
parent.string = 'Top of the world Ma!'
print parent
# prints <parent>Top of the world Ma!</parent>
je suis tombé sur cette question assez vieux tout à l'heure, et la solution proposée était pas tout à fait convenable pour moi. D'autres recherches me conduit à l'approche ci-dessus, et je pensais qu'il peut être utile de partager ce que je fini par utiliser ici.