Dado el caso de uso de Django, hay dos respuestas a esto. Aquí está su django.utils.html.escape
función, para referencia:
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("'", '''))
Para revertir esto, la función Cheetah descrita en la respuesta de Jake debería funcionar, pero le falta la comilla simple. Esta versión incluye una tupla actualizada, con el orden de reemplazo invertido para evitar problemas simétricos:
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)
Esto, sin embargo, no es una solución general; solo es apropiado para cadenas codificadas con django.utils.html.escape
. En términos más generales, es una buena idea seguir con la biblioteca estándar:
# 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)
Como sugerencia: puede tener más sentido almacenar el HTML sin escape en su base de datos. Merecería la pena estudiar para obtener resultados sin escape de BeautifulSoup, si es posible, y evitar este proceso por completo.
Con Django, el escape solo ocurre durante la representación de la plantilla; así que para evitar escapar, simplemente dile al motor de plantillas que no escape de tu cadena. Para hacer eso, use una de estas opciones en su plantilla:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}