2010-12-12 70 views
5

Quelqu'un a-t-il un exemple de code qui illustre comment utiliser Beautiful Soup de Python pour supprimer toutes les balises html, sauf certaines, d'une chaîne de texte?Utilisation de Beautiful Soup pour supprimer les balises html d'une chaîne

Je veux dépouiller tous les javascript et les balises HTML tout sauf:

<a></a> 
<b></b> 
<i></i> 

Et aussi des choses comme:

<a onclick=""></a> 

Merci de nous aider - je ne pouvais pas trouver beaucoup sur Internet pour Cet objectif.

Répondre

8
import BeautifulSoup 

doc = '''<html><head><title>Page title</title></head><body><p id="firstpara" align="center">This is <i>paragraph</i> <a onclick="">one</a>.<p id="secondpara" align="blah">This is <i>paragraph</i> <b>two</b>.</html>''' 
soup = BeautifulSoup.BeautifulSoup(doc) 

for tag in soup.recursiveChildGenerator(): 
    if isinstance(tag,BeautifulSoup.Tag) and tag.name in ('a','b','i'): 
     print(tag) 

cède

<i>paragraph</i> 
<a onclick="">one</a> 
<i>paragraph</i> 
<b>two</b> 

Si vous voulez juste le contenu du texte, vous pouvez changer print(tag)-print(tag.string).

Si vous voulez supprimer un attribut comme onclick="" de la balise a, vous pouvez le faire:

if isinstance(tag,BeautifulSoup.Tag) and tag.name in ('a','b','i'): 
    if tag.name=='a': 
     del tag['onclick'] 
    print(tag) 
+0

Merci - un moyen de supprimer le onclick = « » – ensnare

+0

add « tag.attrs = [ ] 'avant d'imprimer pour supprimer tous les attributs. Si vous avez besoin de plus de contrôle, tag.attrs est juste une liste de paires (nom, valeur) avec lesquelles vous pouvez jouer quand vous en avez besoin. – Spacedman

+0

Hey, c'était vraiment utile, merci beaucoup. – ensnare