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> 
  • So laden Sie die Kommentare nicht beim Analysieren von XML in lxml
  • Automatische XSD-Validierung
  • Die neue RefSeq-Version von NCBI ist kompatibel mit Bio.Entrez.Parser?
  • Deaktivieren Sie die Schaltfläche "Erstellen und Verwerfen" für eine bestimmte Funktion in OpenERP
  • Antwort von Microsoft Translate API in Python
  • Onchange-Funktion in Openerp
  • Wie kann man Informationen in einem XML-Dokument in python 3 neu anordnen?
  • Das Entfernen eines Elements aus einem geparsten XML-Baum stört die Iteration
  • Stripping Inline-Tags mit Python's lxml
  • XML-Deklaration standalone = "ja" lxml
  • Python XPath SyntaxError: ungültiges Prädikat
  • Python ist die beste Programmiersprache der Welt.