[Anfängerfrage] Umlaute

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
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

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.
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

Hmm... blöde Frage, aber wie mache ich das?
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

print tag.id.decode("iso-8859-1"), tag.name.decode("iso-8859-1")
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

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?
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du willst ja auch tag.name umwandeln - und kein Element! ;-)
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

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?
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Weil es das Encoding deiner Konsole erfolgreich bestimmen konnte und implizit konvertiert hat. Aber das ``"%s" % ressource.name`` ist doch ein Quatsch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

Warum ist das Quatsch?
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Weil es nichts anderes macht, als den String in einen String einzufügen, der aus nichts anderem besteht. Lass es doch mal weg.
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

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)
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

print ressource.id, ressource.name.encode("iso-8859-1")
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

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
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was sagt denn?

Code: Alles auswählen

print type(ressource.name)
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

<type 'objectify.StringElement'>
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Siehe mein Post.
Du könntest dir aber auch anschauen, welche Methoden das Objekt hat.
Chivas
User
Beiträge: 14
Registriert: Dienstag 16. Juni 2009, 10:14
Wohnort: München

Vielen Dank für eure Hilfe, hat mir sehr geholfen.
Ich bin ein blutiger Python-Anfänger und bitte um Rücksicht.
Antworten