Ändern der Elementwert mit BeautifulSoup kehrt leeres Element
-
22-08-2019 - |
Frage
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>
Wie kann ich den Inhalt des Elements, in diesem Fall das Element in den Variablen „machen“, ohne den Inhalt zu verlieren? Wenn Sie mich zu anderen reinen Python-Modulen zeigen könnten Weichen xml-Dokumente bestehenden ändern können, lassen Sie es mich wissen.
PS! BeautifulSoup ist für Screenscraping und sowohl von HTML und XML-Parsing!
Lösung
Überprüfen Sie die Dokumentation auf replaceWith
out . Dies funktioniert:
make.contents[0].replaceWith('Top of the world Ma!')
Andere Tipps
BeautifulSoup Version 4 (bs4
) verwenden, können Sie das gleiche erreichen, indem Aktualisierung string
Eigenschaft direkt:
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>
Dieser Ansatz funktioniert gut für den Fall, wenn das Element andere Elemente enthält, und Sie möchten den gesamten Inhalt durch einen neuen ersetzt werden:
parent = soup.find('parent')
parent.string = 'Top of the world Ma!'
print parent
# prints <parent>Top of the world Ma!</parent>
stieß ich auf diese ziemlich alte Frage gerade jetzt, und die Lösung vorgesehen war nicht ganz geeignet für mich. Weitere Forschung führt mich zu dem obigen Ansatz, und ich dachte, es vielleicht nützlich zu teilen, was mich hier am Ende mit.