lxml und unicode

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

hi,
ich stehe mal wieder auf dem Schlauch. Ich versuche momentan eine XML-Datei mit lxml einzulesen und mir Informationen zu den einzelnen Elementen ausgeben zu lassen. Die XML-Datei ist als utf-8 abgespeichert. Zumindest ist das in der Datei angegeben und sie sieht gut aus wenn ich sie mir als utf-8 in meinem Editor anzeigen lasse. Lese ich mir die Datei mit lxml ein und lasse sie mir den eingelesenen Baum folgendermaßen ausgeben:

Code: Alles auswählen

with open("test.xml", "r") as f:
    tree = etree.parse(f)

print etree.tostring(tree, pretty_print=True, encoding="UTF-8")
bekomme ich den kompletten Baum schön kodiert ausgegeben.
Probleme bekomme ich erst wenn ich auf beispielsweise den Text eines Elements (sagt man das so?) zugreifen möchte der ein Unicode-Zeichen enthält.
bei einem Zugriff auf den Text eines Elements mit

Code: Alles auswählen

for elem in root.iterchildren():
    print elem.tag, elem.text

 File "test.py", line 18, in search_values
    print elem.tag, elem.text
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 3: ordinal not in range(128)
bekomme ich einen UnicodeEncodeError ausgeworfen - in der Doku habe ich mittlerweile gefunden das ich bei Python Versionen unter 3.0 nur Unicode als Ausgabe erwarten kann wenn ich mir den ganzen Baum mit ``etree.tostring()`` ausgeben lasse. Ansonsten wird mit strings gearbeitet.
Wie kann ich mir die strings denn nu anzeigen lassen? Bisher habe ich immer versucht mit encode ``some_string.encode('utf-8')`` als bytestring darstellen zu lassen. Mitlerweile habe ich so viele Varianten ausprobiert - ich weiss gar nicht mehr wo ich anfangen soll.
Wenn mir jemand nen Tipp geben könnte wie ich weitermachen könnte wäre ich echt dankbar
Sebastian
BlackJack

@Lonestar: Ich glaube Du bringst Unicode und Kodierungen durcheinander. Der Zugriff ist nicht das Problem sondern das ``print`` eines `unicode`-Objekts. Das funktioniert nur wenn Python die erwartete Kodierung des anderen Endes von `sys.stdout` erraten kann. Man sollte deshalb vor der Ausgabe immer explizit selber kodieren. Und das sollte dann auch funktionieren, zumindest ohne eine Ausnahme.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

BlackJack hat geschrieben:@Lonestar: Ich glaube Du bringst Unicode und Kodierungen durcheinander.
damit hattest du wohl recht. Ich habe ein wenig [wiki=Von Umlauten, Unicode und Encodings]hier im Wiki[/wiki] nachgelesen und es hat klick gemacht.

dabei war ich überzeugt davon das ich es schon mit ``.encode('utf-8')`` probiert hatte. Ich habs erst mal wie im Wiki vorgeschlagen mit ``stdout_encoding`` als variable eingefügt.

besten dank nochmal
Antworten