saxutils.escape() 逃逸分号两次
我正在尝试使用saxutils.escape方法来转义分号。
saxutils.escape('<;', {';': ';'})
我希望它能生成
'<;'
但实际上它给出的结果是
'<;;'
这是故意这样设计的吗?我该如何得到我想要的结果呢?
3 个回答
1
这是故意这样设计的,Frédéric Hamidi 也解释了原因。
那么,你该如何得到你想要的呢?
可以参考 @agf 的建议:
escape_table = {
"&": "&",
">": ">",
"<": "<",
";": ";",
}
def escape(text):
return "".join(escape_table.get(c,c) for c in text)
1
这是因为 escape() 函数会考虑到被转义的 <
最后的分号字符,并按照指示将其替换为 ;
。所以,<;
会变成 <;;
。
通常情况下,分号不需要这样转义,所以我认为这不是函数的错误,只是处理这个特定字符时的一个特殊情况。
3
你的问题在于 saxutils.escape
的工作方式分为两个步骤。首先,它会处理 <
、>
和 &
这些字符,然后再用 entities
来处理刚刚得到的结果。
所以,一旦 <
被替换成 <
,你就得到了 <;
,最终结果变成了 <;;
。
简单来说,这个过程是有道理的。如果你需要处理分号,那不是因为 HTML 的原因,而是为了双重处理它们。在这种情况下,处理 HTML 所需的分号是合理的。
你无法通过 saxutils.escape
得到你想要的结果。你需要使用其他的方法来处理。可以参考一下 Python Wiki 上关于 HTML 转义的页面,里面有一些建议。
你也可以使用我在 如何在多个文件中同时查找和替换多个查询的最佳方法? 中提到的方法,来同时替换分号和其他模式,这样就不会出现重复替换的情况。