2011-04-12 212 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