【发布时间】:2011-12-16 11:30:49
【问题描述】:
我有一个代表 html 文档的字符串。我正在尝试用一些替换 html 替换该文档中的文本,当然不包括标记和属性值。我认为这很简单,但是当您想用标记替换文本时,它非常乏味。例如,将somekeyword 替换为<a href = "link">somekeyword</a>。
from lxml.html import fragments_fromstring, fromstring, tostring
from re import compile
def markup_aware_sub(pattern, repl, text):
exp = compile(pattern)
root = fromstring(text)
els = [el for el in root.getiterator() if el.text]
els = [el for el in els if el.text.strip()]
for el in els:
text = exp.sub(repl, el.text)
if text == el.text:
continue
parent = el.getparent()
new_el = fromstring(text)
new_el.tag = el.tag
for k, v in el.attrib.items():
new_el.attrib[k] = v
parent.replace(el, new_el)
return tostring(root)
markup_aware_sub('keyword', '<a>blah</a>', '<div><p>Text with keyword here</p></div>')
它有效,但前提是关键字正好是两个“嵌套”。必须有比上述更好的方法,但是在谷歌上搜索了几个小时后,我找不到任何东西。
【问题讨论】:
-
为什么不使用 html 解析器呢? Python 有一个内置的 html 解析器。
-
你能举一个“之前”和“之后”的例子吗?假设您有
<body><div><p class="keyword">My keyword</p></div><div>keyword</div></body>,是否应该将所有“关键字”文本替换为<a>blah</a>,而不是属性? -
@unni +1:一个 html 解析器将允许搜索所有
<p>内容而无需质疑。关于替换关键字,您并没有真正使用正则表达式,这对性能有好处(但是问题标题有点错误)。
标签: python html regex replace lxml