Compte tenu du cas d'utilisation de Django, il y a deux réponses à cela. Voici sa django.utils.html.escape
fonction, pour référence:
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("'", '''))
Pour inverser cela, la fonction Cheetah décrite dans la réponse de Jake devrait fonctionner, mais il manque le guillemet simple. Cette version inclut un tuple mis à jour, avec l'ordre de remplacement inversé pour éviter les problèmes symétriques:
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)
Ceci, cependant, n'est pas une solution générale; il n'est approprié que pour les chaînes encodées avec django.utils.html.escape
. Plus généralement, c'est une bonne idée de s'en tenir à la bibliothèque 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)
À titre indicatif: il peut être plus judicieux de stocker le HTML sans échappement dans votre base de données. Il vaudrait la peine de chercher si possible à récupérer des résultats non échappés de BeautifulSoup et d'éviter complètement ce processus.
Avec Django, l'échappement se produit uniquement lors du rendu du modèle; donc pour éviter de vous échapper, dites simplement au moteur de création de modèles de ne pas échapper à votre chaîne. Pour ce faire, utilisez l'une de ces options dans votre modèle:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}