我正试图通过saxutils.escape方法逃避分号。
saxutils.escape('<;', {';': ';'})
我希望它能够产生
'<;'
但它给出了
'<;;'
这是设计的吗?我怎样才能得到预期的结果?
答案 0 :(得分:3)
您的问题是saxutils.escape
分两步完成。首先,它解析<
,>
和&
,然后使用entities
来解析该解析的结果。
一旦<
被<
取代,您就会<;
,所以最终会得到<;;
。
基本上,它正在做的事情是有道理的。如果你需要转义分号,那不是因为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()将转义的<
的最后一个分号字符考虑在内,并按照指示将其替换为;
。因此,<;
会<;;
。
分号通常不需要以这种方式进行转义,因此我认为这不是函数中的错误,只是具有此特定字符的边缘情况。
答案 2 :(得分:1)
这是设计上的,FrédéricHamidi解释了为什么会这样。
那么你怎么能得到你想要的东西呢?
采取@ agf的建议:
escape_table = {
"&": "&",
">": ">",
"<": "<",
";": ";",
}
def escape(text):
return "".join(escape_table.get(c,c) for c in text)