Mögliche Duplikate:
Wie konvertiert man HTML-Entitäten in Python in Unicode und umgekehrt?
python
html
html-entities
Hekevintran
quelle
quelle
Antworten:
Was das "Umgekehrte" betrifft (das ich selbst brauchte, was mich dazu brachte, diese Frage zu finden, die nicht half, und anschließend eine andere Seite, die die Antwort hatte ):
u'some string'.encode('ascii', 'xmlcharrefreplace')
gibt eine einfache Zeichenfolge mit allen Nicht-ASCII-Zeichen zurück, die in XML-Entitäten (HTML) umgewandelt wurden.
quelle
>>> u'\u2019'.encode('utf-8').decode('utf-8').encode('ascii', 'xmlcharrefreplace')
gibt'’'
Sie müssen BeautifulSoup haben .
from BeautifulSoup import BeautifulStoneSoup import cgi def HTMLEntitiesToUnicode(text): """Converts HTML entities to unicode. For example '&' becomes '&'.""" text = unicode(BeautifulStoneSoup(text, convertEntities=BeautifulStoneSoup.ALL_ENTITIES)) return text def unicodeToHTMLEntities(text): """Converts unicode to HTML entities. For example '&' becomes '&'.""" text = cgi.escape(text).encode('ascii', 'xmlcharrefreplace') return text text = "&, ®, <, >, ¢, £, ¥, €, §, ©" uni = HTMLEntitiesToUnicode(text) htmlent = unicodeToHTMLEntities(uni) print uni print htmlent # &, ®, <, >, ¢, £, ¥, €, §, © # &, ®, <, >, ¢, £, ¥, €, §, ©
quelle
Update für Python 2.7 und BeautifulSoup4
Unescape - Unicode-HTML zum Unicode mit
htmlparser
(Python 2.7 Standardbibliothek):>>> escaped = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood' >>> from HTMLParser import HTMLParser >>> htmlparser = HTMLParser() >>> unescaped = htmlparser.unescape(escaped) >>> unescaped u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood' >>> print unescaped Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood
Unescape - Unicode-HTML zum Unicode mit
bs4
(BeautifulSoup4):>>> html = '''<p>Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood</p>''' >>> from bs4 import BeautifulSoup >>> soup = BeautifulSoup(html) >>> soup.text u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood' >>> print soup.text Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood
Escape - Unicode zu Unicode HTML mit
bs4
(BeautifulSoup4):>>> unescaped = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood' >>> from bs4.dammit import EntitySubstitution >>> escaper = EntitySubstitution() >>> escaped = escaper.substitute_html(unescaped) >>> escaped u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood'
quelle
htmlparser
ist jetzt dokumentiert, und da dieser Kommentar nicht prominent ist, bleibt dieser Teil der Antwort.Wie aus der Antwort von hekevintran hervorgeht , können Sie die
cgi.escape(s)
Codierung von Stings verwenden. Beachten Sie jedoch, dass die Codierung von Anführungszeichen in dieser Funktion standardmäßig falsch ist und es möglicherweise eine gute Idee ist, dasquote=True
Schlüsselwortargument neben Ihrer Zeichenfolge zu übergeben. Aber auch durch Übergeben entgehtquote=True
die Funktion nicht einfachen Anführungszeichen ("'"
) (Aufgrund dieser Probleme ist die Funktion seit Version 3.2 veraltet. )Es wurde vorgeschlagen,
html.escape(s)
anstelle von zu verwendencgi.escape(s)
. (Neu in Version 3.2)Wurde
html.unescape(s)
auch in Version 3.4 eingeführt .In Python 3.4 können Sie also:
html.escape(text).encode('ascii', 'xmlcharrefreplace').decode()
diese Option , um Sonderzeichen in HTML-Entitäten zu konvertieren.html.unescape(text)
zum Konvertieren von HTML-Entitäten zurück in Klartextdarstellungen.quelle
$ python3 -c " > import html > print( > html.unescape('&©—') > )" &©— $ python3 -c " > import html > print( > html.escape('&©—') > )" &©— $ python2 -c " > from HTMLParser import HTMLParser > print( > HTMLParser().unescape('&©—') > )" &©— $ python2 -c " > import cgi > print( > cgi.escape('&©—') > )" &©—
HTML erfordert nur strikt, dass
&
(kaufmännisches Und) und<
(linke spitze Klammer / Vorzeichen) maskiert werden. https://html.spec.whatwg.org/multipage/parsing.html#data-statequelle
Wenn sich jemand wie ich da draußen fragt, warum einige Entitätsnummern (Codes)
™ (for trademark symbol), € (for euro symbol)
nicht richtig codiert sind, liegt der Grund darin, dass diese Zeichen in ISO-8859-1 (auch bekannt als Windows-1252) nicht definiert sind.Beachten Sie auch, dass der Standardzeichensatz ab HTML5 utf-8 ist und ISO-8859-1 für HTML4 war
Also müssen wir irgendwie umgehen (zuerst diese finden und ersetzen)
Referenz (Ausgangspunkt) aus Mozillas Dokumentation
https://developer.mozilla.org/en-US/docs/Web/Guide/Localizations_and_character_encodings
quelle
Ich habe die folgende Funktion verwendet, um aus einer XLS-Datei gerippten Unicode in eine HTML-Datei zu konvertieren und dabei die in der XLS-Datei enthaltenen Sonderzeichen beizubehalten:
def html_wr(f, dat): ''' write dat to file f as html . file is assumed to be opened in binary format . if dat is nul it is replaced with non breakable space . non-ascii characters are translated to xml ''' if not dat: dat = ' ' try: f.write(dat.encode('ascii')) except: f.write(html.escape(dat).encode('ascii', 'xmlcharrefreplace'))
hoffe, das ist nützlich für jemanden
quelle
Zur
python3
Verwendunghtml.unescape()
:import html s = "&" decoded = html.unescape(s) # &
quelle
#!/usr/bin/env python3 import fileinput import html for line in fileinput.input(): print(html.unescape(line.rstrip('\n')))
quelle