Seite 1 von 1
Hex in HTML
Verfasst: Sonntag 11. April 2010, 15:56
von dragoon
Hallo Pythoner!
Ich komm mal gleich zur Sache
Ich verwende python3.1 um per urllib.request.urlopen den quelltext einer Internetseite einzulesen und mir daraus Informationen zu ziehen. Leider sind aber manche "ungewöhnlichen" Buchstaben durch einen Art Hex string dargestellt. Z.B. "'" für " ' ". str.decode() geht ja in 3.1 nicht mehr deswegen meine Frage wie ich solche Buchstaben wieder umwandle und wie ihr das am besten lösen würdet?
Vielen Dank für Eure Hilfe!!!
MfG
Verfasst: Sonntag 11. April 2010, 16:02
von nemomuk
Code: Alles auswählen
In [32]: from xml.sax.saxutils import escape, unescape
In [33]: unescape(escape('asd asd a<>!"§$%&/()='))
Out[34]: 'asd asd a<>!"\xc2\xa7$%&/()='
Verfasst: Sonntag 11. April 2010, 16:10
von dragoon
Das ging aber jetzt wirklich fix!!!
War aber nicht das was ich gemeint habe:
Ich habe folgenden string: "Exposé"
Und als Ausgabe will ich: "Exposé"
Danke für die Antwort!
Verfasst: Sonntag 11. April 2010, 16:48
von Dav1d
Verfasst: Sonntag 11. April 2010, 16:55
von snafu
Das Programm wirft allerdings eine Ausnahme. Ich würde hier - wie in so vielen Fällen - nach Trial & Error vorgehen, anstatt auf bestimmte Voraussetzungen zu prüfen. Die relevanten Zeilen lauten dann:
Code: Alles auswählen
try:
import htmlentitydefs
except ImportError:
from html.entities as htmlentitydefs
...und natürlich kann dann auch der Import von `sys` wegfallen. Auch das direkte Importieren von `name2codepoint` kann hier nicht schaden.
Verfasst: Sonntag 11. April 2010, 17:00
von Dav1d
@snafu: du hast Recht
Ich hab den Import von sys, und das prüfen mit sys.version_info, aus einem anderen Code, weil ich dort noch viel mehr importiere (urllib, etc.) und da ist es dann nötig mit sys die Version zu überprüfen
Verfasst: Sonntag 11. April 2010, 17:04
von derdon
snafu: Zeile 4 kann so natürlich nicht funktionieren
Da solltest du noch mal einen SyntaxError abfangen, wenn du so auf exceptions stehst
Verfasst: Sonntag 11. April 2010, 17:21
von snafu
Damit alle Menschen in Frieden schlafen können:
Code: Alles auswählen
import re
try:
from htmlentitydefs import name2codepoint
except ImportError:
from html.entities import name2codepoint
unichr = chr
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(name2codepoint[text[1:-1]])
except KeyError:
pass
return text # leave as is
return re.sub("&#?\w+;", fixup, text)
if __name__ == '__main__':
print(unescape("Exposé"))
Verfasst: Sonntag 11. April 2010, 18:12
von dragoon
Wao das ging aber jetzt wirklich schnell!!!
Genau dass was ich gesucht habe! Und mit mit den ganzen exceptions ist das Ding auch noch unkaputtbar
Vielen Dank für Eure super schnelle Hilfe!
Schönen Sonntag Abend, Ciao