Dato il caso d'uso Django, ci sono due risposte a questo. Ecco la sua django.utils.html.escape
funzione, per riferimento:
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("'", '''))
Per invertire ciò, la funzione Ghepardo descritta nella risposta di Jake dovrebbe funzionare, ma manca la virgoletta singola. Questa versione include una tupla aggiornata, con l'ordine di sostituzione invertito per evitare problemi simmetrici:
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)
Questa, tuttavia, non è una soluzione generale; è appropriato solo per le stringhe codificate con django.utils.html.escape
. Più in generale, è una buona idea attenersi alla libreria standard:
# 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)
Come suggerimento: potrebbe essere più sensato archiviare l'HTML senza caratteri di escape nel database. Vale la pena cercare di ottenere risultati non salvati da BeautifulSoup, se possibile, ed evitare del tutto questo processo.
Con Django, l'escaping si verifica solo durante il rendering del modello; quindi per evitare di scappare basta dire al motore di template di non sfuggire alla stringa. Per fare ciò, usa una di queste opzioni nel tuo modello:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}