Seite 1 von 1

lxml und unicode

Verfasst: Freitag 26. März 2010, 18:39
von Lonestar
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

Verfasst: Freitag 26. März 2010, 18:47
von 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.

Verfasst: Freitag 26. März 2010, 19:58
von Lonestar
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