saxutils.escape() 逃逸分号两次

2 投票
3 回答
563 浏览
提问于 2025-04-16 23:36

我正在尝试使用saxutils.escape方法来转义分号。

saxutils.escape('<;', {';': '&#59;'})

我希望它能生成

'&lt;&#59;'

但实际上它给出的结果是

'&lt&#59;&#59;'

这是故意这样设计的吗?我该如何得到我想要的结果呢?

3 个回答

1

这是故意这样设计的,Frédéric Hamidi 也解释了原因。

那么,你该如何得到你想要的呢?

可以参考 @agf 的建议:

escape_table = {
    "&": "&amp;",
    ">": "&gt;",
    "<": "&lt;",
    ";": "&#59;",
    }

def escape(text):
    return "".join(escape_table.get(c,c) for c in text)
1

这是因为 escape() 函数会考虑到被转义的 &lt; 最后的分号字符,并按照指示将其替换为 &#59;。所以,<; 会变成 &lt&#59;&#59;

通常情况下,分号不需要这样转义,所以我认为这不是函数的错误,只是处理这个特定字符时的一个特殊情况。

3

你的问题在于 saxutils.escape 的工作方式分为两个步骤。首先,它会处理 <>& 这些字符,然后再用 entities 来处理刚刚得到的结果。

所以,一旦 < 被替换成 &lt;,你就得到了 &lt;;,最终结果变成了 &lt&#59;&#59;

简单来说,这个过程是有道理的。如果你需要处理分号,那不是因为 HTML 的原因,而是为了双重处理它们。在这种情况下,处理 HTML 所需的分号是合理的。

你无法通过 saxutils.escape 得到你想要的结果。你需要使用其他的方法来处理。可以参考一下 Python Wiki 上关于 HTML 转义的页面,里面有一些建议。

你也可以使用我在 如何在多个文件中同时查找和替换多个查询的最佳方法? 中提到的方法,来同时替换分号和其他模式,这样就不会出现重复替换的情况。

撰写回答