BeautifulSoup ile komut dosyası etiketlerini kaldırabilir miyim?


93

Script etiketleri ve tüm içerikleri BeautifulSoup ile HTML'den kaldırılabilir mi, yoksa Normal İfadeler veya başka bir şey kullanmak zorunda mıyım?

Yanıtlar:


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

Kaldırılacak ek etiketleri zincirlemenin en iyi yolu nedir? Şu anda komutu birbiri ardına tekrar edersem işe yarıyor, [çorbadaki s için s.extract () ('script')] ve ardından [çorbadaki s için s.extract () ('iframe')] vb. , ancak onları böyle zincirlersem [çorbadaki ('iframe', 'script')].
— Ila 18'12

8
@Ali Kullanmanız gerekecek [s.extract() for s in soup(['iframe', 'script'])]Unutmayın, birden fazla etiket kullanmak için parametre bir liste olmalıdır
— Fábio Diniz 18'12

: FábioDiniz @ nasıl böyle bir şey çıkarmak olur '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? Aynı mı?
— user2883071

2
Bu işlemden sonra çorba nesnesi işe yaramaz hale gelir, artık etiket bulunmaz.
— imrek

1
Bu modası geçmiş, BeautifulSoup dizeyi şimdi html olarak biçimlendiriyor gibi görünüyor:<html><head></head><body><p>baba</p></body></html>
— CloC

38

İleride başvurmak isteyebilecekler için güncellenmiş cevap: Doğru cevap. decompose() Farklı yollar kullanabilirsiniz, ancak decomposeyerinde çalışır.

Örnek kullanım:

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

"Komut dosyası", "img" gibi döküntülerden kurtulmak için oldukça kullanışlıdır.


8
Arasındaki fark decomposeve extractolduğu ikinci döner eski hemen yok eder, oysa uzaklaştırılmıştır şey. Yani bu, sorunun daha kesin cevabıdır, ancak diğer yöntemler işe yarar.
— Mike

1
Decompose, komut dosyası etiketlerinin içeriğini kaldırmaz, yalnızca etiketleri kaldırır.
— Roland Pihlakas

Yorumlarınıza katılıyorum. Bu yüzden removeiçeriğe verilen OP'ye göre doğru cevabı söyledim . Genellikle gereksiz etiketlerin ve biçimlendirmenin HTML'sini temizlemek için kullanılır.
— Abhishek Dujari

7
Aslında, belgelere göre: "Tag.decompose () ağaçtan bir etiketi kaldırır, ardından onu ve içeriğini tamamen yok eder:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
— jarcobi889

1
@Vangel Özür dilerim, sanırım yorumuma bir söz eklemeyi unuttum: Bu yorumla Roland Pihlakas'a yanıt verdiğime inanıyorum.
— jarcobi889

23

( Resmi belgelerde ) belirtildiği gibi extract, arama ile eşleşen tüm alt ağacı kaldırmak için yöntemi kullanabilirsiniz .

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

Belirli bir sınıfa sahip bir etiketi kaldırmanın bir yolu var mı? Aynı ada sahip tüm etiketleri kaldırmak istemiyorum, ancak belirli bir sınıfa sahip tek bir etiket bloğu.
— mulaixi

Tek yapmanız gereken, aramak extractiçin belirli öğeleri seçmektir . [x.extract() for x in a.select('span.className')]
— Edvard Rejthar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.