Враховуючи випадок використання Джанго, на це є дві відповіді. Ось його django.utils.html.escape
функція для довідок:
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("'", '''))
Щоб змінити це, функція гепарда, описана у відповіді Джейка, повинна спрацювати, але не вистачає одноцитати. Ця версія включає оновлений кортеж, з тим, щоб порядок заміни було змінено, щоб уникнути симетричних проблем:
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)
Це, однак, не є загальним рішенням; він підходить лише для рядків, закодованих django.utils.html.escape
. Більш загально, це гарна ідея дотримуватися стандартної бібліотеки:
# 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)
Як пропозиція: можливо, буде більше сенсу зберігати HTML без нагляду у вашій базі даних. Варто було б поглянути на отримання нездійснених результатів від BeautifulSoup, якщо можливо, і взагалі уникати цього процесу.
У режимі Django втеча відбувається лише під час надання шаблону; щоб запобігти втечі, просто скажіть двигуну-шаблону не уникати рядка. Для цього використовуйте один із цих параметрів у своєму шаблоні:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}