web-dev-qa-db-ja.com

Python、逆関数urllib.urlencode

処理後にデータを変換するにはどうすれば_urllib.urlencode口述する? urllib.urldecode 存在しない。

86
Artyom

ドキュメント for urlencodeと言うと、

Urlparseモジュールは関数parse_qs()およびparse_qsl()を提供します。これらの関数はクエリ文字列をPythonデータ構造に解析するために使用されます。

(以前のPythonリリースでは、cgiモジュールにありました)。たとえば、次のようになります。

>>> import urllib
>>> import urlparse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urlparse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

元の辞書dと「ラウンドトリップ」辞書d1は、後者が値として(単一のアイテム、この場合)listsを持っていることです。これは、クエリ文字列に一意性の保証がないためです。また、各キーに複数の値が与えられていることを知ることはアプリにとって重要かもしれません(つまり、リストは常に単一項目のものではありません;-)。

代替として:

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

ペアのシーケンスを取得できます(urlencodeはこのような引数も受け入れます-この場合は順序を保持しますが、dictの場合は順序を保持しません;-)。重複する「キー」が存在しないことがわかっている場合、または存在するかどうかは気にしない場合は、(上で示したように)dictを呼び出してリスト以外の値を持つ辞書を取得できます。ただし、一般に、重複が存在する場合に何をしたいかを考慮する必要があります(Pythonはユーザーに代わってそれを決定しません;-) 。

120
Alex Martelli

Python 3コード Alexのソリューション:

>>> import urllib.parse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.parse.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urllib.parse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

代替案:

>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

parse_qslは可逆です:

>>> urllib.parse.urlencode(sq)
'a=b&c=d'
17
phobie

urllib.unquote_plus() はあなたが望むことをします。 %xxエスケープを同等の1文字に置き換え、プラス記号をスペースに置き換えます。

例:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

利回り

'/~candidates/?name=john connolly'.
16
Andrew Farrell