Angesichts des Django-Anwendungsfalls gibt es zwei Antworten darauf. Hier ist seine django.utils.html.escape
Funktion als Referenz:
def escape(html):
"""Returns the given HTML with ampersands, quotes and carets encoded."""
return mark_safe(force_unicode(html).replace('&', '&').replace('<', '&l
t;').replace('>', '>').replace('"', '"').replace("'", '''))
Um dies umzukehren, sollte die in Jakes Antwort beschriebene Cheetah-Funktion funktionieren, es fehlt jedoch das einfache Anführungszeichen. Diese Version enthält ein aktualisiertes Tupel, wobei die Reihenfolge des Ersetzens umgekehrt ist, um symmetrische Probleme zu vermeiden:
def html_decode(s):
"""
Returns the ASCII decoded version of the given HTML string. This does
NOT remove normal HTML tags like <p>.
"""
htmlCodes = (
("'", '''),
('"', '"'),
('>', '>'),
('<', '<'),
('&', '&')
)
for code in htmlCodes:
s = s.replace(code[1], code[0])
return s
unescaped = html_decode(my_string)
Dies ist jedoch keine allgemeine Lösung; Es ist nur für Zeichenfolgen geeignet, die mit codiert sind django.utils.html.escape
. Generell ist es eine gute Idee, sich an die Standardbibliothek zu halten:
# Python 2.x:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
unescaped = html_parser.unescape(my_string)
# Python 3.x:
import html.parser
html_parser = html.parser.HTMLParser()
unescaped = html_parser.unescape(my_string)
# >= Python 3.5:
from html import unescape
unescaped = unescape(my_string)
Als Vorschlag: Es kann sinnvoller sein, den HTML-Code nicht in Ihrer Datenbank zu speichern. Es lohnt sich, wenn möglich zu versuchen, uneingeschränkte Ergebnisse von BeautifulSoup zurückzugewinnen und diesen Prozess insgesamt zu vermeiden.
Bei Django erfolgt das Escape nur während des Renderns von Vorlagen. Um ein Entkommen zu verhindern, weisen Sie die Template-Engine an, nicht aus Ihrer Saite zu entkommen. Verwenden Sie dazu eine der folgenden Optionen in Ihrer Vorlage:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}