Versi pendek!
import re, cgi
tag_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
# Remove well-formed tags, fixing mistakes by legitimate users
no_tags = tag_re.sub('', user_input)
# Clean up anything else by escaping
ready_for_web = cgi.escape(no_tags)
Sumber regex: MarkupSafe . Versi mereka menangani entitas HTML juga, sedangkan yang cepat ini tidak.
Mengapa saya tidak bisa menghapus tag saja dan membiarkannya?
Adalah satu hal untuk menjauhkan orang dari <i>italicizing</i>berbagai hal, tanpa meninggalkan iyang mengambang. Tapi mengambil input sewenang-wenang dan membuatnya sama sekali tidak berbahaya. Sebagian besar teknik pada halaman ini akan membuat hal-hal seperti komentar tertutup ( <!--) dan kurung sudut yang bukan bagian dari tag ( blah <<<><blah) tetap utuh. Versi HTMLParser bahkan dapat meninggalkan tag lengkap, jika ada di dalam komentar tidak tertutup.
Bagaimana jika templat Anda {{ firstname }} {{ lastname }}? firstname = '<a'dan lastname = 'href="http://evil.com/">'akan diizinkan masuk oleh setiap stripper tag pada halaman ini (kecuali @Medeiros!), karena mereka tidak menyelesaikan tag sendiri. Menghapus tag HTML normal tidak cukup.
Django strip_tags, versi yang lebih baik (lihat tajuk berikutnya) dari jawaban atas pertanyaan ini, memberikan peringatan berikut:
Sama sekali TIDAK ADA jaminan yang diberikan tentang string yang dihasilkan menjadi HTML aman. Jadi, JANGAN PERNAH tandai hasil strip_tagspanggilan tanpa melarikan diri terlebih dahulu, misalnya dengan escape().
Ikuti saran mereka!
Untuk menghapus tag dengan HTMLParser, Anda harus menjalankannya beberapa kali.
Sangat mudah untuk mengelak dari jawaban teratas untuk pertanyaan ini.
Lihat string ini ( sumber dan diskusi ):
<img<!-- --> src=x onerror=alert(1);//><!-- -->
Pertama kali HTMLParser melihatnya, ia tidak bisa memastikan bahwa itu <img...>adalah sebuah tag. Itu terlihat rusak, jadi HTMLParser tidak menghilangkannya. Hanya mengeluarkan <!-- comments -->, meninggalkan Anda dengan
<img src=x onerror=alert(1);//>
Masalah ini diungkapkan kepada proyek Django pada bulan Maret 2014. Yang lama strip_tagspada dasarnya sama dengan jawaban teratas untuk pertanyaan ini. Versi baru mereka pada dasarnya menjalankannya dalam satu lingkaran sampai menjalankannya lagi tidak mengubah string:
# _strip_once runs HTMLParser once, pulling out just the text of all the nodes.
def strip_tags(value):
"""Returns the given HTML with all tags stripped."""
# Note: in typical case this loop executes _strip_once once. Loop condition
# is redundant, but helps to reduce number of executions of _strip_once.
while '<' in value and '>' in value:
new_value = _strip_once(value)
if len(new_value) >= len(value):
# _strip_once was not able to detect more tags
break
value = new_value
return value
Tentu saja, semua ini bukan masalah jika Anda selalu luput dari hasilnya strip_tags().
Pembaruan 19 Maret 2015 : Ada bug dalam versi Django sebelum 1.4.20, 1.6.11, 1.7.7, dan 1.8c1. Versi ini dapat memasukkan infinite loop dalam fungsi strip_tags (). Versi tetap direproduksi di atas. Lebih detail di sini .
Hal-hal baik untuk disalin atau digunakan
Kode contoh saya tidak menangani entitas HTML - versi paket Django dan MarkupSafe lakukan.
Contoh kode saya diambil dari perpustakaan MarkupSafe yang sangat baik untuk pencegahan skrip lintas situs. Lebih mudah dan cepat (dengan speedup C ke versi Python aslinya). Ini termasuk dalam Google App Engine , dan digunakan oleh Jinja2 (2.7 dan lebih tinggi) , Mako, Pylons, dan banyak lagi. Ini bekerja dengan mudah dengan template Django dari Django 1.7.
Strip_tags Django dan utilitas html lainnya dari versi terbaru bagus, tapi saya merasa mereka kurang nyaman daripada MarkupSafe. Mereka cukup mandiri, Anda dapat menyalin apa yang Anda butuhkan dari file ini .
Jika Anda perlu menghapus hampir semua tag, perpustakaan Bleach bagus. Anda dapat menerapkannya seperti "pengguna saya dapat membuat huruf miring, tetapi mereka tidak bisa membuat iframe."
Pahami properti stripper tag Anda! Jalankan tes fuzz di atasnya! Berikut adalah kode yang saya gunakan untuk melakukan penelitian untuk jawaban ini.
catatan lamban - Pertanyaannya sendiri adalah tentang mencetak ke konsol, tapi ini adalah hasil Google teratas untuk "python strip html dari string", jadi itu sebabnya jawaban ini 99% tentang web.
&). Anda dapat 1) menghapusnya bersama dengan tag (sering tidak diinginkan, dan tidak perlu karena mereka setara dengan teks biasa), 2) membiarkannya tidak berubah (solusi yang sesuai jika teks yang dilucuti akan segera kembali ke konteks HTML) atau 3 ) decode mereka ke teks biasa (jika teks yang dilucuti pergi ke database atau konteks non-HTML lainnya, atau jika kerangka web Anda secara otomatis melakukan pelolosan HTML teks untuk Anda).