Hex in HTML

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
dragoon
User
Beiträge: 3
Registriert: Sonntag 11. April 2010, 15:47

Sonntag 11. April 2010, 15:56

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
Zuletzt geändert von dragoon am Sonntag 11. April 2010, 18:13, insgesamt 1-mal geändert.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Sonntag 11. April 2010, 16:02

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$%&/()='
dragoon
User
Beiträge: 3
Registriert: Sonntag 11. April 2010, 15:47

Sonntag 11. April 2010, 16:10

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!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Sonntag 11. April 2010, 16:48

Ich hab dazu mal was geschrieben => http://blog.dav1d.de/code/python-html-entities/
the more they change the more they stay the same
Benutzeravatar
snafu
User
Beiträge: 5465
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 11. April 2010, 16:55

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. :)
Zuletzt geändert von snafu am Sonntag 11. April 2010, 17:01, insgesamt 1-mal geändert.
shcol (Repo | Doc | PyPi)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Sonntag 11. April 2010, 17:00

@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
the more they change the more they stay the same
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Sonntag 11. April 2010, 17:04

snafu: Zeile 4 kann so natürlich nicht funktionieren ;) Da solltest du noch mal einen SyntaxError abfangen, wenn du so auf exceptions stehst :P
Benutzeravatar
snafu
User
Beiträge: 5465
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 11. April 2010, 17:21

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é"))
shcol (Repo | Doc | PyPi)
dragoon
User
Beiträge: 3
Registriert: Sonntag 11. April 2010, 15:47

Sonntag 11. April 2010, 18:12

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
Antworten