Djangoのユースケースを考えると、これには2つの答えがあります。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("'", '''))
これを逆にするには、Jakeの回答で説明されているCheetah関数が機能するはずですが、単一引用符がありません。このバージョンには、対称的な問題を回避するために置換の順序が逆になっている、更新されたタプルが含まれています。
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 %}