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 %}
html.parser.HTMLParser().unescape()
tidak digunakan lagi dalam 3.5. Gunakanhtml.unescape()
sebagai gantinya.Dengan perpustakaan standar:
HTML Escape
HTML Unescape
sumber
HTMLParser
perlu subkelas, diberi tahu apa yang harus dilakukan dengan semua bagian dari objek yang diberi makan, dan kemudian memberi makan objek yang akan diuraikan, seperti yang terlihat di sini . Selain itu, Anda masih ingin menggunakanname2codepoint
dikt untuk mengkonversi setiap identitas html ke karakter aktual yang diwakilinya.HTMLParser
tidak bisa berfungsi seperti yang kita inginkan jika kita memasukkan entitas HTML ke dalamnya. Mungkin saya harus mengganti namahtmlparser
untuk_htmlparser
menyembunyikannya, dan hanya mengeksposunescape
metode menjadi seperti fungsi pembantu.from html import unescape
sebagai gantinyaUntuk pengkodean html, ada cgi.escape dari perpustakaan standar:
Untuk decoding html, saya menggunakan yang berikut:
Untuk hal yang lebih rumit, saya menggunakan BeautifulSoup.
sumber
Gunakan solusi daniel jika rangkaian karakter yang disandikan relatif terbatas. Jika tidak, gunakan salah satu dari banyak parsing pustaka HTML.
Saya suka BeautifulSoup karena dapat menangani XML / HTML yang cacat:
http://www.crummy.com/software/BeautifulSoup/
untuk pertanyaan Anda, ada contoh dalam dokumentasi mereka
sumber
from bs4 import BeautifulSoup
BeautifulSoup("Sacré bleu!").contents[0]
Dengan Python 3.4+:
sumber
Lihat di bagian bawah halaman ini di Python wiki , setidaknya ada 2 opsi untuk "unescape" html.
sumber
Komentar Daniel sebagai jawaban:
"melarikan diri hanya terjadi di Django selama rendering templat. Oleh karena itu, tidak diperlukan unescape - Anda cukup memberi tahu mesin templating untuk tidak melarikan diri. {{context_var | safe}} atau {% autoescape off%} {{context_var}} { % endautoescape%} "
sumber
Saya menemukan fungsi yang bagus di: http://snippets.dzone.com/posts/show/4569
sumber
 
yang harus diterjemahkan ke hal yang sama seperti 
dan
.Jika ada yang mencari cara sederhana untuk melakukannya melalui templat Django, Anda selalu dapat menggunakan filter seperti ini:
Saya memiliki beberapa data yang berasal dari vendor dan semua yang saya posting memiliki tag html yang sebenarnya ditulis pada halaman yang diberikan seolah-olah Anda sedang melihat sumbernya. Kode di atas sangat membantu saya. Semoga ini bisa membantu orang lain.
Bersulang!!
sumber
Meskipun ini adalah pertanyaan yang sangat lama, ini mungkin berhasil.
Django 1.5.5
sumber
"��"
. Kemudian demi saturesult.encode('utf-16', 'surrogatepass').decode('utf-16')
, akhirnya saya mendapatkan kembali yang asli.Saya menemukan ini di kode sumber Cheetah (di sini )
tidak yakin mengapa mereka membalikkan daftar, saya pikir itu ada hubungannya dengan cara mereka menyandikan, jadi dengan Anda itu mungkin tidak perlu dibalik. Juga jika saya jadi Anda, saya akan mengubah htmlCodes menjadi daftar tuple daripada daftar daftar ... ini terjadi di perpustakaan saya :)
saya perhatikan judul Anda meminta encode juga, jadi di sini adalah fungsi encode Cheetah.
sumber
Anda juga dapat menggunakan django.utils.html.escape
sumber
Di bawah ini adalah fungsi python yang menggunakan modul
htmlentitydefs
. Itu tidak sempurna. Versihtmlentitydefs
yang saya miliki tidak lengkap dan mengasumsikan bahwa semua entitas decode ke satu codepoint yang salah untuk entitas seperti≂̸
:http://www.w3.org/TR/html5/named-character-references.html
Dengan peringatan itu, inilah kodenya.
sumber
Ini adalah solusi termudah untuk masalah ini -
Dari halaman ini .
sumber
Mencari solusi paling sederhana dari pertanyaan ini dalam Django dan Python saya temukan Anda dapat menggunakan fungsi builtin untuk melarikan diri / menghapus kode html.
Contoh
Saya menyimpan kode html Anda di
scraped_html
danclean_html
:Django
Anda membutuhkan Django> = 1.0
hapus jejak
Untuk menghapus kode html tergores Anda, Anda dapat menggunakan django.utils.text.unescape_entities yang:
melarikan diri
Untuk menghindari kode html bersih Anda, Anda dapat menggunakan django.utils.html.escape yang:
Python
Anda membutuhkan Python> = 3.4
hapus jejak
Untuk menghapus kode html tergores Anda, Anda dapat menggunakan html.unescape yang:
melarikan diri
Untuk menghindari kode html bersih Anda, Anda dapat menggunakan html.escape yang:
sumber