2011-11-15 18 views
44

エスケープ文字を含むURLを含むリストがあります。これらの文字は、HTMLページを回復したときにurllib2.urlopenによって設定されています:URLにエスケープ文字をデコードする

http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=edit 
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&action=history 
http://www.sample1webpage.com/index.php?title=%E9%A6%96%E9%A1%B5&variant=zh 

はPythonで、アンエスケープ形式にそれらをバック変換する方法はありますか?

P.S:URLがUTF-8

答えて

82

Official docs.

urllib.unquote(ストリング)

でエンコードされ、それらの単一文字分だけ%xxエスケープを交換します。

例:unquote('/%7Econnolly/')は、'/~connolly/'である。

次にデコードしてください。


更新:Pythonの3のために 、次のように書きます。

urllib.parse.unquote(url) 

Python 3 docs.

+0

にunquoteショー私がsample.com/index.php?title=\xe9\xa6\x96\xe9\xa1上記の言ったように\ XB5&アクション= EDIは...多分私はこのケースでは非常によく自分自身を説明していませんでした...しかし、URLは中国の一つであり、私はそれをデコードしたいのは、元のchar、あなたがこれを配置する必要があり@dyoserないにunquote 1 – dyoser

+3

ですあなたの質問で。 –

+0

@ root45これは1つの答えに対するコメントです...だからここで良いです。ご理解いただきありがとうございます。 – dyoser

6

あなたはurllib.unquote

+0

私はunquoteを使用すると(この方法で感謝します...)、この文字列を表示しますhttp://sample.com/index.php?title = \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5&action = ediと私は彼らが中国の文字だと知っています...どうすればそれらを見ることができますか?私はこれがユニコードだと思いますよね? – dyoser

+0

これはあなたの質問にはすでにあります。これらはUTF-8バイトです。あなたは 'b" \ xe9 \ xa6 \ x96 \ xe9 \ xa1 \ xb5 ".decode(" utf-8 ")'(最近のPython構文を使用しています)でUnicode文字列に変換することができます。 – tripleee

3
import re 

def unquote(url): 
    return re.compile('%([0-9a-fA-F]{2})',re.M).sub(lambda m: chr(int(m.group(1),16)), url) 
+7

必要なものを、おそらくもっと慎重に処理するライブラリが組み込まれていると、なぜ手動でregexとlambdaを使用するのですか? –

+4

クールなソリューション! 'urllib2'は標準的なpython distriの一部ではありません。 「再」は。 – cxxl

9

urllib.unquote_plusを使用することができます

>>> import urllib 
>>> urllib.unquote('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29') 
'erythrocyte+membrane+protein+1,+PfEMP1+(VAR)' 
>>> urllib.unquote_plus('erythrocyte+membrane+protein+1%2C+PfEMP1+%28VAR%29') 
'erythrocyte membrane protein 1, PfEMP1 (VAR)' 
18

そして、あなたはあなたが使用することができPython3を使用している場合:

urllib.parse.unquote(url) 
+0

また、 'urllib.request.unquote' – Ben

関連する問題