Seite 1 von 1

Problem mit String Encoding von HTML Page

Verfasst: Dienstag 30. August 2011, 14:53
von dani__
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

Re: Problem mit String Encoding von HTML Page

Verfasst: Dienstag 30. August 2011, 16:09
von sma
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

Re: Problem mit String Encoding von HTML Page

Verfasst: Dienstag 30. August 2011, 17:00
von dani__
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

Re: Problem mit String Encoding von HTML Page

Verfasst: Mittwoch 31. August 2011, 16:02
von Dav1d
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)