Wie bekomme ich Python bs4, um richtig auf XML zu arbeiten?

Ich versuche, Python und BeautifulSoup 4 (bs4) zu verwenden, um Inkscape SVGs in ein XML-ähnliches Format für einige proprietäre Software zu konvertieren. Ich kann nicht scheinen, bs4 zu bekommen, um ein minimales Beispiel richtig zu analysieren. Ich brauche den Parser, um selbstverschließende Tags zu respektieren, Unicode zu behandeln und keine HTML-Sachen hinzuzufügen. Ich dachte, die 'lxml' Parser mit selfClosingTags sollte es tun, aber nope! Hör zu.

#!/usr/bin/python from __future__ import print_function from bs4 import BeautifulSoup print('\nbs4 mangled XML:') print(BeautifulSoup('<x><c name="b1"><d value="a"/></c></x>', features = "lxml", selfClosingTags = ('d')).prettify()) print('''\nExpected output: <x> <c name="b1"> <d value="a"/> </c> </x>''') 

Das druckt

 bs4 mangled XML: /usr/local/lib/python2.7/dist-packages/beautifulsoup4-4.4.1-py2.7.egg/bs4/__init__.py:112: UserWarning: BS4 does not respect the selfClosingTags argument to the BeautifulSoup constructor. The tree builder is responsible for understanding self-closing tags. <html> <body> <x> <c name="b1"> <d value="a"> </d> </c> </x> </body> </html> Expected output: <x> <c name="b1"> <d value="a"/> </c> </x> 

Ich habe verwandte StackOverflow Fragen überprüft, und ich finde die Lösung nicht.

Diese Frage richtet sich an die HTML-Kesselplatte, aber nur für das Analysieren von Unterabschnitten von HTML, nicht zum Analysieren von XML.

Diese Frage bezieht sich darauf, beautifulsoup 4 zu respektieren, um sich selbst zu schließen, und hat keine akzeptierten Antworten.

Diese Frage scheint zu zeigen, dass das Übergeben des selfClosingTags-Arguments helfen sollte, aber wie Sie sehen können, erzeugt dies jetzt eine Warnung BS4 does not respect the selfClosingTags argument , und selbstschließende Tags sind verstümmelt.

Diese Frage deutet darauf hin, dass mit "xml" (nicht "lxml") leere Tags automatisch automatisch zu schließen. Dies könnte für meine Zwecke funktionieren, aber die Anwendung der "xml" Parser auf meine tatsächlichen Daten fehlschlägt, weil die Dateien Unicode enthalten, die der "xml" Parser nicht unterstützt.

Ist "xml" anders als "lxml", und ist es im Standard, dass "xml" unicode nicht unterstützen kann und "lxml" keine Selbstschluss-Tags enthalten kann ? Vielleicht versuche ich einfach etwas zu tun, was verboten ist?

One Solution collect form web for “Wie bekomme ich Python bs4, um richtig auf XML zu arbeiten?”

Wenn Sie möchten, dass das Ergebnis als xml ausgegeben wird, dann analysieren Sie es als das. Ihre xml Daten können Unicode enthalten, aber Sie müssen die Codierung deklarieren:

 #!/usr/bin/env python # -*- encoding: utf8 -*- 

Die SelfClosingTags werden nicht mehr erkannt . Stattdessen betrachtet schöne Suppe ein leeres Tag, um ein Leer-Element-Tag zu sein. Wenn Sie ein Kind zu einem Leer-Element-Tag hinzufügen, hört es auf, ein Leer-Element-Tag zu sein.

Das Ändern Ihrer Funktion, um so auszusehen, sollte funktionieren (zusätzlich zur Kodierung):

 print(BeautifulSoup('<x><c name="b1"><d value="a®"/></c></x>', features = "xml").prettify()) 

Ergebnis:

 <?xml version="1.0" encoding="utf-8"?> <x> <c name="b1"> <d value="aÂŽ"/> </c> </x> 
  • Python: gibt es einen XML-Parser als Generator implementiert?
  • Automatische XSD-Validierung
  • Parse XML mit Bedingungen
  • Python etree kontrolles leeres Tag-Format
  • Wie man eine XML-Datei mit Codierungsdeklaration in Python analysiert?
  • Wie man Kommentare beim Analysieren von XML mit Python / ElementTree behält
  • Lesen von XML-Datei und Abrufen der Attribute Wert in Python
  • Wie kann ich ein Word-Dokument mit Python erstellen?
  • Wie kann diese Funktion umgeschrieben werden, um OrderedDict zu implementieren?
  • Python ElementTree Unterstützung für das Parsen unbekannter XML Entities?
  • Wie man Attribut eines Etree Element entfernen?
  • Python ist die beste Programmiersprache der Welt.