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.:
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)