Problem mit String Encoding von HTML Page

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
dani__
User
Beiträge: 2
Registriert: Dienstag 30. August 2011, 14:37

Hi,

ich schreibe mir momentan ein Skript das Daten von IMDB zieht und mich informiert wenn neue Folgen zu Serien die ich schaue erscheinen.

Dazu downloade ich die entsprechende Seite mit curl:

Code: Alles auswählen

html = str(subprocess.check_output(['curl','-s',url]))
Und verarbeite die Daten dann weiter.

Jetzt hab ich da aber ASCII Zeichen als Hex-Codes dabei, z.B.:

Code: Alles auswählen

"Fringe - Grenzfälle des FBI"
Ich hab schon die Dokumentation durchgeguckt, aber keine vernünftige Methode gefunden diese Zeichen zu übersetzen.

Gibts da eine lib-funktion dafür die ich einfach nicht gefunden habe?

Grüße
Daniel
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Du könntest die Entities mit einem regulären Ausdruck selbst ersetzen:

Code: Alles auswählen

import re
s = u""Fringe - Grenzfälle des FBI""
s = re.sub("&#x(..);", lambda m:unichr(int(m.group(1), 16)), s)
Doch ich würde empfehlen, statt curl und Handarbeit lieber einen HTML-Parser zu benutzen, denn wahrscheinlich willst du doch das HTML-Dokument noch weiter verarbeiten und irgendwelche Dinge extrahieren. Hier bietet sich lxml an. Aber auch BeautifulSoup als reine Python-Lösung ist einen Blick wert. Oder zur Not auch der bei Python mitgelieferte zusammen mit dem etree-API.

Stefan
dani__
User
Beiträge: 2
Registriert: Dienstag 30. August 2011, 14:37

Hi,

perfekt, das hat funktioniert. Das ein HTML Parser sinnvoller gewesen wäre ist mir schon klar, ich wollte den Parsing Teil in Python als Übung schreiben, ich steig grad erst auf Python um und ich mag die sinnlosen Beispiele die man in der Literatur findet nicht so :)

Danke nochmal für die schnelle Hilfe.

Gruß
Daniel
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich hab auch noch ne richtige Funktion, nicht sowas magisches...

Code: Alles auswählen

import re
import htmlentitydefs

def unescape(text):
    """Removes HTML or XML character references
          and entities from a text string.
          keep &, >, < in the source code.
       from Fredrik Lundh
       http://effbot.org/zone/re-sub.htm#unescape-html
    """
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # character reference
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # named entity
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # leave as is
    return re.sub("&#?\w+;", fixup, text)
the more they change the more they stay the same
Antworten