2011-08-15 12 views
2

saxutils.escapeメソッドでセミコロンをエスケープしようとしています。私はそれがsaxutils.escape()はセミコロンを2回エスケープします

'<&#59;' 

を生成することを期待しかし、それは

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

を与える

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

は、設計によって、このですか?そして、私はどのように私の期待した結果を得ることができますか

答えて

3

問題は、saxutils.escapeが2つのステップで機能することです。まず、<,>、および&を解析した後、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?への私の答えのようなものを使用して、セミコロンを他のパターンと同時に置き換えることができます。何も置き換えないでください。

+0

次に、私の期待した結果を得るための適切な方法は何ですか? – bxx

+0

私の更新を見てください。リンクされたPython wikiページにいくつかの提案があります。 – agf

1

これは、escape()がエスケープされた&lt;の最後のセミコロン文字を考慮し、指示通りに&#59;に置き換えたからです。したがって、<;&lt&#59;&#59;となります。

通常、セミコロンはそのようにエスケープする必要はありません。そのため、この特定の文字のエッジケースのみがバグだとは思われません。

+0

は、セキュリティ上の懸念のために、私はセミコロンのユーザーの入力がエスケープされたいです。 – bxx

+0

これは簡単ではありません。上流に(最初のアンパサンド文字がエスケープされるため)、下流に(最後のセミコロン文字がエスケープされるため)実行できません。 Tim Pietzckerが答えているように、文字の置換を試すことができます。 –

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) 
+0

これを行うよりも、 'saxutils.escape'を使わない方が良いでしょう。 – agf

+0

これはユーザーの入力です。ある日、ユーザーはあなたの「特別な」文字を含むテキストを入力します。それは物事を混乱させるでしょう。 – agf

+0

@agf:ああ、あなたの意見が分かります。 –

関連する問題