Mögliche Duplikate:
Wie konvertiert man HTML-Entitäten in Python in Unicode und umgekehrt?
Mögliche Duplikate:
Wie konvertiert man HTML-Entitäten in Python in Unicode und umgekehrt?
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.
>>> 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
# &, ®, <, >, ¢, £, ¥, €, §, ©
# &, ®, <, >, ¢, £, ¥, €, §, ©
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'
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, das quote=True
Schlüsselwortargument neben Ihrer Zeichenfolge zu übergeben. Aber auch durch Übergeben entgeht quote=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 verwenden cgi.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.$ 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-state
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
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
Zur python3
Verwendung html.unescape()
:
import html
s = "&"
decoded = html.unescape(s)
# &
#!/usr/bin/env python3
import fileinput
import html
for line in fileinput.input():
print(html.unescape(line.rstrip('\n')))