鉴于 Django 用例,对此有两个答案。下面是它的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 %}