Seite 1 von 1
Python HTML Umlaute parsen
Verfasst: Samstag 14. August 2010, 11:53
von MasterJulian
Ich habe das Problem dass in meine Python Programm die Umlaute z.B. so ankommen: "ä". Wie bekomme ich die jetzt wieder zu ä?
http://wiki.python.org/moin/EscapingHtml habe ich bereits gefunden. Die unescape Methode via HTMLParser löscht das Zeichen und via htmlentitydecode ändert sich nichts. Eine Liste wäre mein letzter Ausweg. Kennt jemand von euch eine bessere Lösung?
Re: Python HTML Umlaute parsen
Verfasst: Samstag 14. August 2010, 12:05
von BlackJack
@MasterJulian: Verwende einen HTML-Parser der Unicode liefert.
Re: Python HTML Umlaute parsen
Verfasst: Samstag 14. August 2010, 21:08
von sma
Zur Not entfernst du die entities eben per Hand:
Code: Alles auswählen
import re
def replace(s):
return re.sub(r'&#(\d+);', lambda m: chr(int(m.group(1))), s)
print(replace("ärger"))
Das ist Python3.x. In 2.x müsstest du unichr() benutzen und der String sollte natürlich ein echter String vom Typ unicode sein und kein bytes-Array. Das wiederum bedeutet, dass du die Transformation erst nach dem Parsen machen kannst, weil dann erst der HTML-Parser das Encoding ausgewertet und aus einem bytes-Array mit eine Hierarchie von HTML-Elementen mit Text-Knoten gemacht hat.
Eigentlich sollte aber ein Parser die Dinger selbst auflösen.
Stefan
Re: Python HTML Umlaute parsen
Verfasst: Samstag 14. August 2010, 21:55
von BlackJack
@sma: Das was Du da machst, kann die Methode aus dem Wiki, die angeblich nicht funktioniert, auch:
Code: Alles auswählen
In [64]: unescape("Hänschen")
Out[64]: 'H\xe4nschen'
Re: Python HTML Umlaute parsen
Verfasst: Sonntag 15. August 2010, 10:34
von MasterJulian
BlackJack hat geschrieben:@sma: Das was Du da machst, kann die Methode aus dem Wiki, die angeblich nicht funktioniert, auch:
Code: Alles auswählen
In [64]: unescape("Hänschen")
Out[64]: 'H\xe4nschen'
Ja bei mir funktioniert das Leider nicht. Ich verwende:
Code: Alles auswählen
import htmllib
def unescape(s):
p = htmllib.HTMLParser(None)
p.save_bgn()
p.feed(s)
return p.save_end()
Bei mir kommt nur das raus:
>>> unescape('ä')
''
>>> unescape("Hänschen")
'Hänschen'
//edit: Damit funktionierts:
http://effbot.org/zone/re-sub.htm#unescape-html