Seite 1 von 1
[Anfängerfrage] Umlaute
Verfasst: Mittwoch 17. Juni 2009, 11:49
von Chivas
Hallo,
Ich möchte mit lxml eine xml-datei parsen und die Daten dann auch irgendwie darstellen. In der xml sind allerdings auch Umlaute. Wie bringe ich Python jetzt dazu mir das richtig anzuzeigen?
Code: Alles auswählen
#coding: iso-8859-1
from lxml import objectify
file = open ("file.xml")
tree = objectify.parse(file)
tags = tree.xpath("//tag")
for tag in tags:
print tag.id, tag.name
Fehlermeldung wenn ich das Programm in einer Konsole ausführen will (Linux):
File "pythprob.py", line 9, in <module>
print tag.id, tag.name
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 3: ordinal not in range(128)
In dem angegebenen coding ist die Datei auch abgespeichert. Und die xml-Datei hat das selbe coding. Was passt also nicht?
€:
http://www.python-forum.de/topic-5095.html hab ich schon gefunden. Hat mir aber irgendwie nicht wirklich weiter geholfen.
Verfasst: Mittwoch 17. Juni 2009, 11:56
von cofi
Die ``coding`` Zeile bezieht sich auf den Code, auf die Kodierung mit der der Code kodiert ist, damit der Interpreter Sonderzeichen auch richtig lesen kann. Sie sagt nicht, dass Python alles was hier passiert mit der angegebenen Kodierung machen soll.
Dekodier mal ``tag.id` und ``tag.name`` mit deiner Kodierung.
Verfasst: Mittwoch 17. Juni 2009, 12:23
von Chivas
Hmm... blöde Frage, aber wie mache ich das?
Verfasst: Mittwoch 17. Juni 2009, 12:30
von cofi
Code: Alles auswählen
print tag.id.decode("iso-8859-1"), tag.name.decode("iso-8859-1")
Verfasst: Mittwoch 17. Juni 2009, 12:41
von Chivas
Ja, dann hab ichs ja doch prinzipiell richtig gemacht
AttributeError: no such child: decode
Aber der Fehler hat mich gerade ziemlich verunsichert. So funktioniert das also nicht. Kann ich das irgendwie umgehen?
Verfasst: Mittwoch 17. Juni 2009, 13:03
von Hyperion
Du willst ja auch tag.name umwandeln - und kein Element!

Verfasst: Mittwoch 17. Juni 2009, 13:28
von Chivas
Code: Alles auswählen
print ressource.id, ("%s"% ressource.name).encode("iso-8859-1")
Damit funktioniert es.
Und ich hab es gerade noch ausprobiert. Es funktioniert auch ohne dem .encode...
Warum?
Verfasst: Mittwoch 17. Juni 2009, 13:51
von Leonidas
Weil es das Encoding deiner Konsole erfolgreich bestimmen konnte und implizit konvertiert hat. Aber das ``"%s" % ressource.name`` ist doch ein Quatsch.
Verfasst: Mittwoch 17. Juni 2009, 14:05
von Chivas
Warum ist das Quatsch?
Verfasst: Mittwoch 17. Juni 2009, 14:08
von cofi
Weil es nichts anderes macht, als den String in einen String einzufügen, der aus nichts anderem besteht. Lass es doch mal weg.
Verfasst: Mittwoch 17. Juni 2009, 14:15
von Chivas
wenn ich "%s"% weglasse, werden mir die Umlaute nicht angezeigt. Stattdessen bekomme ich diese Fehlermeldung:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 3: ordinal not in range(128)
Verfasst: Mittwoch 17. Juni 2009, 14:16
von Leonidas
Code: Alles auswählen
print ressource.id, ressource.name.encode("iso-8859-1")
Verfasst: Mittwoch 17. Juni 2009, 14:17
von cofi
Dann versuch mal
Code: Alles auswählen
print ressource.id, ressource.name.encode("iso-8859-1")
Sollte es sich bei ``ressource.name`` nicht um einen String handeln, ist die explizite Konvertierung per ``str`` zu bevorzugen.
Verfasst: Mittwoch 17. Juni 2009, 14:25
von Chivas
Wie schon gesagt, war genau das mein erster Versuch. Aber da gab es diese Fehlermeldung.
print ressource.name.encode("iso-8859-1")
File "objectify.pyx", line 223, in objectify.ObjectifiedElement.__getattr__
File "objectify.pyx", line 446, in objectify._lookupChildOrRaise
AttributeError: no such child: encode
Verfasst: Mittwoch 17. Juni 2009, 14:34
von Hyperion
Verfasst: Mittwoch 17. Juni 2009, 14:39
von Chivas
<type 'objectify.StringElement'>
Verfasst: Mittwoch 17. Juni 2009, 14:44
von cofi
Siehe mein Post.
Du könntest dir aber auch anschauen, welche Methoden das Objekt hat.
Verfasst: Donnerstag 18. Juni 2009, 09:44
von Chivas
Vielen Dank für eure Hilfe, hat mir sehr geholfen.