Python、反対の関数urllib.urlencode


88

処理後にデータurllib.urlencodeをdict に変換するにはどうすればよいですか? urllib.urldecode存在しません。

回答:


124

ドキュメントのため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は、後者が値としてリスト(この場合は単一アイテム)を持っていることです。これは、クエリ文字列に一意性の保証がないためであり、重要な場合があります各キーにどのような複数の値が指定されているかを知るためにアプリに追加します(つまり、リストは常に単一項目のリストとは限りません;-)。

別の方法として:

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

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


1
非常に徹底した答え。驚くばかり!
Hartley Brody

Python 2に賛成票を投じますが、Python 3はすべてurllibモジュール内にあります。@phobieの回答を参照してください。
openwonk

18

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

>>> 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'

16

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

例:

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

収量

'/~candidates/?name=john connolly'.

2
彼は口述が欲しかったと言いました。だからあなたの答えは間違っています。
balrok 14

4
いや、これは私が探していたものです。
Joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.