2011-04-12 4 views
0

J'ai un document html, dans lequel certains éléments contiennent des éléments que je veux cacher (comme le gouvernement chinois le fait, sauf que je veux juste cacher des informations confidentielles). Par exemple dire que j'ai:python: Remplacer un élément HTML en fonction de son contenu

<div> 
    <span> bkhiu jknd o so so so yui iou 789 </span> 
    <span> 
     bkhiu 
     <div> 56 898tr SECRET oij890 </div> 
    </span> 
</div> 

Et je veux obtenir tous les éléments qui contiennent la chaîne SECRET, et il suffit de remplacer leur contenu entier par ###:

<div> 
    <span> bkhiu jknd o so so so yui iou 789 </span> 
    <span> 
     bkhiu 
     <div>###</div> 
    </span> 
</div> 

J'ai pensé à utiliser minidom et re avec quelque chose comme:

xmldoc = minidom.parseString(my_html_string) 
# filtering nodes by their content 
sensitive_nodes = filter(lambda n: re.search('SECRET', n.nodeValue), 
    xmldoc.getElementsByTagName()) 
# replacing content 
for node in sensitive_nodes: 
    node.nodeValue = '###' 
# output 
my_html_string = xmldoc.toxml() 

Mais d'abord, l'analyse syntaxique ne réussit même pas:

ExpatError: mismatched tag: line 27, column 6 

Et .getElementsByTagName() a besoin d'un paramètre tagName ... alors que je ne me soucie pas du nom de la balise et besoin de tous les nœuds (pour filtrer leur contenu). Eh bien, fondamentalement, ce code ne fonctionne pas du tout, mais c'est juste pour essayer d'expliquer ce que je veux réaliser.

Une idée de comment je pourrais le faire facilement? Avec minidom ou quelque chose de complètement différent?

+0

Bonjour, pourriez-vous indiquer quelle ligne est la ligne 27? :) – Skurmedel

+0

Droit! C'est le début du document: http://dpaste.com/531242/ (et ln 27 est le dernier, même s'il est affiché ici en 24 ici ...) – sebpiq

Répondre

2

Ok ... Je l'ai trouvé un moyen très simple, en utilisant BeautifulSoup:

import re 
from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(my_html) 
nodes_to_censor = soup.findAll(text=re.compile('.*SECRET.*')) 
for node in nodes_to_censor: 
    node.replaceWith('###') 
+0

C'est pythontastique. – Skurmedel

Questions connexes