python:根据内容替换HTML元素

时间:2011-04-12 11:36:36

标签: python html minidom

我有一个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参数...而我不关心标记名称并且需要所有节点(以便按其内容进行过滤)。基本上,代码根本不起作用,但只是试图解释我想要实现的目标。

知道我怎么能这么做吗?与minidom或完全不同的东西?

1 个答案:

答案 0 :(得分:3)

好的......我找到了一种非常简单的方法,使用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('###')