Tôi có thể xóa các thẻ script bằng BeautifulSoup không?


90

Có thể xóa các thẻ script và tất cả nội dung của chúng khỏi HTML bằng BeautifulSoup hay tôi phải sử dụng Biểu thức chính quy hay thứ gì khác không?

Câu trả lời:


160
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<script>a</script>baba<script>b</script>', 'lxml')
>>> for s in soup.select('script'):
>>>    s.extract()
>>> soup
baba

Cách tốt nhất để xâu chuỗi các thẻ bổ sung cần xóa là gì? Ngay bây giờ nó hoạt động nếu tôi lặp lại lệnh lần lượt, với [s.extract () for s in soup ('script')] rồi [s.extract () for s in soup ('iframe')], v.v. , nhưng không phải nếu tôi xâu chuỗi chúng như vậy [s.extract () for s in soup ('iframe', 'script')].
Ila

8
@Ali Bạn sẽ phải sử dụng [s.extract() for s in soup(['iframe', 'script'])]Lưu ý rằng để sử dụng nhiều thẻ, tham số phải được một danh sách
Fábio Diniz

@ FábioDiniz Làm cách nào để trích xuất một cái gì đó như '<script class="blah">a</script>baba<script id="blahhhh">b</script>':? Nó giống nhau không?
user2883071 29/04

2
Đối tượng súp trở nên vô dụng sau thao tác này, không tìm thấy thẻ nào nữa.
imrek

1
Đây là lỗi thời, BeautifulSoup dường như để định dạng chuỗi html bây giờ:<html><head></head><body><p>baba</p></body></html>
CloC

37

Câu trả lời cập nhật cho những người có thể cần tham khảo trong tương lai: Câu trả lời chính xác là. decompose() Bạn có thể sử dụng nhiều cách khác nhau nhưng hiệu decomposequả tại chỗ.

Ví dụ sử dụng:

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>'

Khá hữu ích để loại bỏ các mảnh vụn như 'script', 'img', v.v.


8
Sự khác biệt giữa decomposeextractlà cái sau trả lại thứ đã bị xóa, trong khi cái trước chỉ phá hủy nó. Vì vậy, đây là câu trả lời chính xác hơn cho câu hỏi, nhưng các phương pháp khác vẫn hoạt động.
Mike

1
Decompose không loại bỏ nội dung của các thẻ script, nó chỉ loại bỏ các thẻ.
Roland Pihlakas

Tôi đồng ý với cả hai ý kiến ​​của bạn. Đó là lý do tại sao tôi nói câu trả lời đúng theo OP là removenội dung. Thường được sử dụng để làm sạch HTML của các thẻ và định dạng không cần thiết.
Abhishek Dujari

7
Trên thực tế, theo các tài liệu: "Tag.decompose () loại bỏ một thẻ từ cây, sau đó hoàn toàn phá hủy nó và nội dung của nó:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889

1
@Vangel Apologies, tôi nghĩ rằng tôi đã quên thêm đề cập trong nhận xét của mình: Tôi tin rằng tôi đã phản hồi Roland Pihlakas bằng nhận xét đó.
jarcobi889

22

Như đã nêu trong ( tài liệu chính thức ), bạn có thể sử dụng extractphương pháp để xóa tất cả cây con phù hợp với tìm kiếm.

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.