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&#xE9;"
Und als Ausgabe will ich: "Exposé"

Danke für die Antwort!

Verfasst: Sonntag 11. April 2010, 16:48
von Dav1d
Ich hab dazu mal was geschrieben => http://blog.dav1d.de/code/python-html-entities/

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 :P

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