saxutils.escape()两次转义分号

时间:2011-08-15 08:38:39

标签: python sax

我正试图通过saxutils.escape方法逃避分号。

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

我希望它能够产生

'&lt;&#59;'

但它给出了

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

这是设计的吗?我怎样才能得到预期的结果?

3 个答案:

答案 0 :(得分:3)

您的问题是saxutils.escape分两步完成。首先,它解析<>&,然后使用entities来解析该解析的结果

一旦<&lt;取代,您就会&lt;;,所以最终会得到&lt&#59;&#59;

基本上,它正在做的事情是有道理的。如果你需要转义分号,那不是因为HTML的原因,所以必须要对它们进行双重转义。在这种情况下,有必要转义由HTML所需的转义创建的分号。

saxutils.escape无法获得所需的结果。您需要使用另一种转义方法。有关一些想法,请参阅Python Wiki page on escaping HTML

您还可以使用我对What is the best way to do a find and replace of multiple queries on multiple files?的回答中的内容来与其他模式同时替换分号,这样您就不会对任何内容进行双重替换。

答案 1 :(得分:1)

这是因为escape()将转义的&lt;的最后一个分号字符考虑在内,并按照指示将其替换为&#59;。因此,<;&lt&#59;&#59;

分号通常不需要以这种方式进行转义,因此我认为这不是函数中的错误,只是具有此特定字符的边缘情况。

答案 2 :(得分:1)

这是设计上的,FrédéricHamidi解释了为什么会这样。

那么你怎么能得到你想要的东西呢?

采取@ agf的建议:

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

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