python: замена HTML-элемента в зависимости от его содержимого - PullRequest
1 голос
/ 12 апреля 2011

У меня есть 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>

Я думал об использовании minidom и re с чем-то вроде:

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 ... в то время как мне нет дела до имени тега и мне нужны ВСЕ узлы (для фильтрации по их содержимому). По сути, этот код вообще не работает, а просто пытается объяснить, чего я хочу достичь.

Есть идеи, как я мог бы сделать это легко? С минидом или чем то совсем другим?

1 Ответ

3 голосов
/ 12 апреля 2011

Хорошо ... Я нашел очень простой способ, используя 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('###')
...