Biorąc pod uwagę przypadek użycia Django, są na to dwie odpowiedzi. Oto jego django.utils.html.escape
funkcja w celach informacyjnych:
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("'", '''))
Aby to odwrócić, funkcja Cheetah opisana w odpowiedzi Jake'a powinna działać, ale brakuje pojedynczego cudzysłowu. Ta wersja zawiera zaktualizowaną krotkę z odwróconą kolejnością zastępowania, aby uniknąć problemów z symetrią:
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)
Nie jest to jednak rozwiązanie ogólne; jest odpowiedni tylko dla łańcuchów zakodowanych za pomocą django.utils.html.escape
. Mówiąc bardziej ogólnie, dobrym pomysłem jest pozostanie przy standardowej bibliotece:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
unescaped = html_parser.unescape(my_string)
import html.parser
html_parser = html.parser.HTMLParser()
unescaped = html_parser.unescape(my_string)
from html import unescape
unescaped = unescape(my_string)
Jako sugestia: bardziej sensowne może być przechowywanie kodu HTML bez zmiany znaczenia w bazie danych. Warto byłoby przyjrzeć się, jeśli to możliwe, odzyskać niezakłócone wyniki z BeautifulSoup i całkowicie uniknąć tego procesu.
W Django ucieczka występuje tylko podczas renderowania szablonu; aby zapobiec ucieczce, po prostu powiedz silnikowi szablonów, aby nie uciekał ze struny. Aby to zrobić, użyj jednej z następujących opcji w swoim szablonie:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}