Bisakah saya menghapus tag script dengan BeautifulSoup?

93

Dapatkah tag skrip dan semua kontennya dihapus dari HTML dengan BeautifulSoup, atau apakah saya harus menggunakan Ekspresi Reguler atau yang lainnya?

Sam
sumber

Jawaban:

164
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'lxml')
>>> for s in soup.select('script'):
>>>    s.extract()
>>> soup
baba
Fábio Diniz
sumber
Apa cara terbaik untuk menghubungkan tag tambahan untuk dihapus? Saat ini berfungsi jika saya mengulangi perintah satu demi satu, dengan [s.extract () for s in soup ('script')] lalu [s.extract () for s in soup ('iframe')] dan seterusnya , tetapi tidak jika saya merantai mereka seperti so [s.extract () for s in soup ('iframe', 'script')].
Ila
8
@Ali Anda harus menggunakan [s.extract() for s in soup(['iframe', 'script'])]Perhatikan bahwa untuk menggunakan beberapa tag, parameternya harus berupa daftar
Fábio Diniz
@ FábioDiniz Bagaimana saya akan mengambil sesuatu seperti: '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? Apakah itu sama?
pengguna2883071
2
Objek sup menjadi tidak berguna setelah operasi ini, tidak ada tag yang ditemukan lagi.
imrek
1
Ini sudah usang, BeautifulSoup tampaknya memformat string menjadi html sekarang:<html><head></head><body><p>baba</p></body></html>
CloC
38

Jawaban terbaru untuk mereka yang mungkin membutuhkan referensi di masa mendatang: Jawaban yang benar adalah. decompose() Anda dapat menggunakan cara yang berbeda tetapi decomposebekerja di tempat.

Contoh penggunaan:

soup = BeautifulSoup('<p>This is a slimy text and <i> I am slimer</i></p>')
soup.i.decompose()
print str(soup)
#prints '<p>This is a slimy text and</p>'

Cukup berguna untuk menghilangkan detritus seperti 'script', 'img' dan lain sebagainya.

Abhishek Dujari
sumber
8
Perbedaan antara decomposedan extractadalah bahwa yang terakhir mengembalikan hal yang telah dihapus, sedangkan yang pertama hanya menghancurkannya. Jadi ini adalah jawaban yang lebih tepat untuk pertanyaan tersebut, tetapi metode lain berhasil.
Mike
1
Dekomposisi tidak menghapus konten tag skrip, ini hanya menghapus tag.
Roland Pihlakas
Saya setuju dengan kedua komentar Anda. Karena itulah saya mengatakan jawaban yang benar sesuai OP yang removeisinya. Sering digunakan untuk membersihkan HTML dari tag dan pemformatan yang tidak dibutuhkan.
Abhishek Dujari
7
Sebenarnya, menurut dokumentasi: "Tag.decompose () menghapus tag dari pohon, lalu menghancurkannya sepenuhnya dan isinya:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Apologies, sepertinya saya lupa menambahkan mention di komentar saya: Saya yakin saya menanggapi Roland Pihlakas dengan komentar itu.
jarcobi889
23

Seperti yang dinyatakan di ( dokumentasi resmi ) Anda dapat menggunakan extractmetode ini untuk menghapus semua subpohon yang cocok dengan pencarian.

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
Santiago Alessandri
sumber
Adakah cara untuk menghapus tag dengan kelas tertentu? Saya tidak ingin menghapus semua tag dengan nama yang sama, tetapi hanya satu blok tag dengan kelas tertentu.
mulaixi
Yang harus Anda lakukan adalah memilih elemen tertentu untuk dipanggil extract. [x.extract() for x in a.select('span.className')]
Edvard Rejthar