2011-04-12 102 views
0

我有一个html文档,其中一些元素包含我想隐藏的内容(比如中国政府正在做的事情,除了我只是想隐藏机密信息)。例如说我有:python:根据内容替换HTML元素

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

我想所有包含字符串SECRET的元素,只是###取代他们的全部内容:

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

我曾想过使用minidomre的东西,如:

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() 

但首先解析甚至没有成功:

ExpatError: mismatched tag: line 27, column 6 

而且.getElementsByTagName()需要tagName参数......虽然我不关心标签名称和需要的所有节点(为了通过他们的内容进行筛选)。那么基本上,这些代码根本不起作用,但只是试图解释我想实现的目标。

任何想法如何我可以轻松地做到这一点?用小型号或者完全不同的东西?

+0

你好,你说明这行是第27? :) – Skurmedel 2011-04-12 11:39:59

+0

对!这是文档的开始:http://dpaste.com/531242/(和27是最后一个,即使它显示为24这里...) – sebpiq 2011-04-12 11:45:08

回答

2

好吧...我发现了一个非常简单的方法,使用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

这是pythontastic。 – Skurmedel 2011-04-12 12:14:34