1. ホーム
  2. python

[解決済み] Python, 逆関数 urllib.urlencode

2023-03-09 10:12:03

質問

加工後のデータを変換するには? urllib.urlencode をディクショナリに変換できますか? urllib.urldecode は存在しません。

どのように解決するのですか?

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

代替案として

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

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