Python HTML Umlaute parsen

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
MasterJulian
User
Beiträge: 14
Registriert: Sonntag 8. November 2009, 17:46

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?
BlackJack

@MasterJulian: Verwende einen HTML-Parser der Unicode liefert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
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'
MasterJulian
User
Beiträge: 14
Registriert: Sonntag 8. November 2009, 17:46

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
Antworten