saxutils.escapeメソッドでセミコロンをエスケープしようとしています。私はそれがsaxutils.escape()はセミコロンを2回エスケープします
'<;'
を生成することを期待しかし、それは
'<;;'
を与える
saxutils.escape('<;', {';': ';'})
は、設計によって、このですか?そして、私はどのように私の期待した結果を得ることができますか
saxutils.escapeメソッドでセミコロンをエスケープしようとしています。私はそれがsaxutils.escape()はセミコロンを2回エスケープします
'<;'
を生成することを期待しかし、それは
'<;;'
を与える
saxutils.escape('<;', {';': ';'})
は、設計によって、このですか?そして、私はどのように私の期待した結果を得ることができますか
問題は、saxutils.escape
が2つのステップで機能することです。まず、<
,>
、および&
を解析した後、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?への私の答えのようなものを使用して、セミコロンを他のパターンと同時に置き換えることができます。何も置き換えないでください。
これは、escape()がエスケープされた<
の最後のセミコロン文字を考慮し、指示通りに;
に置き換えたからです。したがって、<;
は<;;
となります。
通常、セミコロンはそのようにエスケープする必要はありません。そのため、この特定の文字のエッジケースのみがバグだとは思われません。
は、セキュリティ上の懸念のために、私はセミコロンのユーザーの入力がエスケープされたいです。 – bxx
これは簡単ではありません。上流に(最初のアンパサンド文字がエスケープされるため)、下流に(最後のセミコロン文字がエスケープされるため)実行できません。 Tim Pietzckerが答えているように、文字の置換を試すことができます。 –
これは設計によるものであり、フレデリック・ハミディ(FrédéricHamidi)はこれがなぜそうであるかを説明しました。
どのようにして自分が望むものを手に入れられますか? AGFの提案@撮影
:私の場合は
escape_table = {
"&": "&",
">": ">",
"<": "<",
";": ";",
}
def escape(text):
return "".join(escape_table.get(c,c) for c in text)
次に、私の期待した結果を得るための適切な方法は何ですか? – bxx
私の更新を見てください。リンクされたPython wikiページにいくつかの提案があります。 – agf