ฉันสามารถลบแท็กสคริปต์ด้วย BeautifulSoup ได้หรือไม่


93

สามารถลบแท็กสคริปต์และเนื้อหาทั้งหมดออกจาก HTML ด้วย BeautifulSoup ได้หรือไม่หรือต้องใช้นิพจน์ทั่วไปหรืออย่างอื่น

คำตอบ:


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

วิธีใดที่ดีที่สุดในการเชื่อมโยงแท็กเพิ่มเติมเพื่อลบออก ตอนนี้มันใช้งานได้ถ้าฉันทำซ้ำคำสั่งทีละคำโดยมี [s.extract () สำหรับ s in soup ('script')] แล้วก็ [s.extract () สำหรับ s in soup ('iframe')] และอื่น ๆ แต่ไม่ใช่ถ้าฉันล่ามโซ่ไว้เช่นนั้น [s.extract () สำหรับ s in soup ('iframe', 'script')]
Ila

8
@Ali คุณจะต้องใช้[s.extract() for s in soup(['iframe', 'script'])]หมายเหตุว่าในการใช้หลายแท็กพารามิเตอร์ต้องเป็นรายการ
Fábio Diniz

@ FábioDinizฉันจะแยกสิ่งที่ต้องการได้'<script class="blah">a</script>baba<script id="blahhhh">b</script>'อย่างไร? มันเหมือนกันไหม?
user2883071

2
วัตถุซุปจะไร้ประโยชน์หลังจากการดำเนินการนี้ไม่พบแท็กอีกต่อไป
imrek

1
สิ่งนี้ล้าสมัยแล้ว BeautifulSoup ดูเหมือนจะจัดรูปแบบสตริงเป็น html ในขณะนี้:<html><head></head><body><p>baba</p></body></html>
CloC

38

คำตอบที่อัปเดตสำหรับผู้ที่อาจต้องการการอ้างอิงในอนาคต: คำตอบที่ถูกต้องคือ decompose() คุณสามารถใช้วิธีต่างๆ แต่ใช้decomposeงานได้ในสถานที่

ตัวอย่างการใช้งาน:

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

มีประโยชน์มากในการกำจัดเศษผงเช่น 'script', 'img' เป็นต้น


8
ความแตกต่างระหว่างdecomposeและextractก็คือสิ่งที่หลังจะส่งคืนสิ่งที่ถูกลบออกไปในขณะที่อดีตจะทำลายมัน นี่คือคำตอบที่แม่นยำยิ่งขึ้นสำหรับคำถาม แต่วิธีอื่น ๆ ได้ผล
Mike

1
Decompose ไม่ได้ลบเนื้อหาของแท็กสคริปต์ แต่จะลบเฉพาะแท็กเท่านั้น
Roland Pihlakas

ฉันเห็นด้วยกับทั้งสองความคิดเห็นของคุณ นั่นคือเหตุผลที่ฉันพูดคำตอบที่ถูกต้องตาม OP ซึ่งเป็นremoveเนื้อหา มักใช้สำหรับการล้าง HTML ของแท็กและการจัดรูปแบบที่ไม่จำเป็น
Abhishek Dujari

7
ตามเอกสาร: "Tag.decompose () ลบแท็กออกจากต้นไม้จากนั้นทำลายแท็กและเนื้อหาทั้งหมด:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889

1
@Vangel Apologies ฉันคิดว่าฉันลืมเพิ่มการกล่าวถึงในความคิดเห็นของฉัน: ฉันเชื่อว่าฉันตอบสนองต่อ Roland Pihlakas ด้วยความคิดเห็นนั้น
jarcobi889

23

ตามที่ระบุไว้ใน ( เอกสารอย่างเป็นทางการ ) คุณสามารถใช้extractวิธีลบทรีย่อยทั้งหมดที่ตรงกับการค้นหา

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]

มีวิธีลบแท็กที่มีคลาสเฉพาะหรือไม่ ฉันไม่ต้องการลบแท็กทั้งหมดที่มีชื่อเดียวกัน แต่มีแท็กเพียงบล็อกเดียวที่มีคลาสเฉพาะ
mulaixi

สิ่งที่คุณต้องทำคือการเลือกองค์ประกอบที่เฉพาะเจาะจงเพื่อโทรextractไป [x.extract() for x in a.select('span.className')]
Edvard Rejthar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.