Mengingat kasus penggunaan Django, ada dua jawaban untuk ini. Berikut django.utils.html.escape
fungsinya, untuk referensi:
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("'", '''))
Untuk membalikkan ini, fungsi Cheetah yang dijelaskan dalam jawaban Jake harus bekerja, tetapi tidak memiliki tanda kutip tunggal. Versi ini mencakup tuple yang diperbarui, dengan urutan penggantian terbalik untuk menghindari masalah simetris:
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)
Namun, ini bukan solusi umum; hanya cocok untuk string yang dikodekan dengan django.utils.html.escape
. Secara umum, itu adalah ide yang baik untuk tetap menggunakan perpustakaan standar:
# 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)
Sebagai saran: mungkin lebih masuk akal untuk menyimpan HTML yang tidak terhapus di database Anda. Akan bermanfaat untuk mendapatkan hasil yang tidak terhindar dari BeautifulSoup jika memungkinkan, dan menghindari proses ini sama sekali.
Dengan Django, melarikan diri hanya terjadi selama rendering template; jadi untuk mencegah melarikan diri Anda hanya memberi tahu mesin templating untuk tidak melarikan diri dari tali Anda. Untuk melakukannya, gunakan salah satu opsi ini di templat Anda:
{{ context_var|safe }}
{% autoescape off %}
{{ context_var }}
{% endautoescape %}