Puis-je supprimer les balises de script avec BeautifulSoup?

90

Les balises de script et tout leur contenu peuvent-ils être supprimés du HTML avec BeautifulSoup, ou dois-je utiliser des expressions régulières ou autre chose?

Sam
la source

Réponses:

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
Fábio Diniz
la source
Quelle est la meilleure façon d'enchaîner des balises supplémentaires à supprimer? Pour le moment, cela fonctionne si je répète la commande l'une après l'autre, avec [s.extract () pour s dans soupe ('script')] puis [s.extract () pour s dans soupe ('iframe')] et ainsi de suite , mais pas si je les enchaîne comme ça [s.extract () for s in soup ('iframe', 'script')].
Ila
8
@Ali Vous devriez utiliser [s.extract() for s in soup(['iframe', 'script'])]Notez que pour utiliser plusieurs balises, le paramètre doit être une liste
Fábio Diniz
@ FábioDiniz Comment pourrais - je extraire quelque chose comme: '<script class="blah">a</script>baba<script id="blahhhh">b</script>'? Est-ce la même?
user2883071
2
L'objet soupe devient inutile après cette opération, aucune balise n'est plus trouvée.
imrek
1
Ceci est obsolète, BeautifulSoup semble formater la chaîne en html maintenant:<html><head></head><body><p>baba</p></body></html>
CloC
37

Réponse mise à jour pour ceux qui pourraient avoir besoin d'une référence future: La bonne réponse est. decompose() Vous pouvez utiliser différentes méthodes mais decomposefonctionne en place.

Exemple d'utilisation:

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

Très utile pour se débarrasser des détritus comme «script», «img», etc.

Abhishek Dujari
la source
8
La différence entre decomposeet extractest que ce dernier renvoie la chose qui a été supprimée, tandis que le premier la détruit simplement. C'est donc la réponse la plus précise à la question, mais les autres méthodes fonctionnent.
Mike
1
Decompose ne supprime pas le contenu des balises de script, il supprime uniquement les balises.
Roland Pihlakas
Je suis d'accord avec vos deux commentaires. C'est pourquoi j'ai dit la bonne réponse selon OP qui était au removecontenu. Souvent utilisé pour nettoyer le HTML des balises et du formatage inutiles.
Abhishek Dujari
7
En fait, selon la documentation: "Tag.decompose () supprime une balise de l'arborescence, puis la détruit complètement ainsi que son contenu:" crummy.com/software/BeautifulSoup/bs4/doc/#decompose
jarcobi889
1
@Vangel Excuses, je pense que j'ai oublié d'ajouter une mention dans mon commentaire: je crois que je répondais à Roland Pihlakas avec ce commentaire.
jarcobi889
22

Comme indiqué dans la ( documentation officielle ), vous pouvez utiliser la extractméthode pour supprimer tous les sous-arbres qui correspondent à la recherche.

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