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'
htmlparserist 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=TrueSchlüsselwortargument neben Ihrer Zeichenfolge zu übergeben. Aber auch durch Übergeben entgeht quote=Truedie 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 python3Verwendung 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')))