如何在保留HTML标签/结构的情况下查找/替换文本
我用正则表达式来处理文本,想要按照自己的需求进行转换,但我希望保留HTML标签。比如说,如果我想把“stack overflow”替换成“stack underflow”,那么应该像这样工作:如果输入是 stack <sometag>overflow</sometag>
,我得到的结果应该是 stack <sometag>underflow</sometag>
(也就是说,字符串的替换完成了,但标签依然保留在那儿...)
6 个回答
3
请注意,随意的替换操作可能会出现不明确的情况。看看下面的例子:
1)
HTML:
A<tag>B</tag>
模式 -> 替换:
AB -> AXB
可能的结果:
AX<tag>B</tag>
A<tag>XB</tag>
2)
HTML:
A<tag>A</tag>A
模式 -> 替换:
A+ -> WXYZ
可能的结果:
W<tag />XYZ
W<tag>X</tag>YZ
W<tag>XY</tag>Z
W<tag>XYZ</tag>
WX<tag />YZ
WX<tag>Y</tag>Z
WX<tag>YZ</tag>
WXY<tag />Z
WXY<tag>Z</tag>
WXYZ
适合你情况的算法类型,主要取决于你可能搜索的模式和处理模糊情况的规则。
3
Beautiful Soup 或者 HTMLParser 是你的解决方案。
10
在处理和修改HTML时,建议使用DOM库,而不是正则表达式:
- lxml:一个解析器,可以处理文档和HTML,还可以使用BeautifulSoup和html5lib来解析。
- BeautifulSoup:一个解析器,可以处理文档和HTML。
- html5lib:一个解析器,也有一个序列化功能。
- ElementTree:一个文档对象和XML序列化工具。
- cElementTree:一个以C扩展实现的文档对象。
- HTMLParser:一个解析器。
- Genshi:包含解析器、文档和HTML序列化功能。
- xml.dom.minidom:标准库中内置的文档模型,可以被html5lib解析。
内容摘自 http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/。
在这些选项中,我推荐使用lxml、html5lib和BeautifulSoup。