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.