Posso rimuovere i tag di script con BeautifulSoup?


90

I tag di script e tutto il loro contenuto possono essere rimossi dall'HTML con BeautifulSoup o devo usare espressioni regolari o qualcos'altro?

Risposte:


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

Qual è il modo migliore per concatenare tag aggiuntivi da rimuovere? In questo momento funziona se ripeto il comando uno dopo l'altro, con [s.extract () for s in soup ('script')] poi [s.extract () for s in soup ('iframe')] e così via , ma non se li incateno in questo modo [s.extract () for s in soup ('iframe', 'script')].
Ila

8
@Ali Dovresti usare [s.extract() for s in soup(['iframe', 'script'])]Nota che per usare più tag, il parametro deve essere un elenco
Fábio Diniz

@ FábioDiniz Come potrei estrarre qualcosa come: '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? È lo stesso?
user2883071

2
L'oggetto soup diventa inutile dopo questa operazione, non vengono più trovati tag.
imrek

1
Questo è obsoleto, BeautifulSoup sembra ora formattare la stringa in html:<html><head></head><body><p>baba</p></body></html>
CloC

37

Risposta aggiornata per coloro che potrebbero aver bisogno di riferimenti futuri: la risposta corretta è. decompose() Puoi usare modi diversi ma decomposefunziona sul posto.

Utilizzo di esempio:

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

Abbastanza utile per sbarazzarsi di detriti come "script", "img" e così via.


8
La differenza tra decomposee extractè che quest'ultimo restituisce la cosa che è stata rimossa, mentre la prima la distrugge. Quindi questa è la risposta più precisa alla domanda, ma gli altri metodi funzionano.
Mike

1
Decompose non rimuove il contenuto dei tag di script, rimuove solo i tag.
Roland Pihlakas

Concordo con entrambi i tuoi commenti. Questo è il motivo per cui ho detto la risposta corretta come da OP che era ai removecontenuti. Spesso utilizzato per pulire l'HTML da tag e formattazione non necessari.
Abhishek Dujari

7
In realtà, secondo la documentazione: "Tag.decompose () rimuove un tag dall'albero, quindi lo distrugge completamente e il suo contenuto:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889

1
@Vangel Apologies, penso di aver dimenticato di aggiungere una menzione nel mio commento: credo di aver risposto a Roland Pihlakas con quel commento.
jarcobi889

22

Come indicato nella ( documentazione ufficiale ) è possibile utilizzare il extractmetodo per rimuovere tutta la sottostruttura che corrisponde alla ricerca.

import BeautifulSoup
a = BeautifulSoup.BeautifulSoup("<html><body><script>aaa</script></body></html>")
[x.extract() for x in a.findAll('script')]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.