Hatena::Grouppython

Pythonで遊ぶよ

 | 

2010-10-02

urllib.urlencode に unicode を渡すとエラー

02:33

Python 2.x の話。3.x は知らない。

args = {"foo": "bar", "hoge": "fuga", "piyo": 123}

foo=bar&hoge=fuga&piyo=123 にしたい。

そういうときは urllib.urlencode を使って

import urllib
print urllib.urlencode(args)

とするみたいなのだが、unicode が混じってると使えない。

>>> args = {"foo": "bar", "hoge": u"ほげ", "piyo": 123}
>>> urllib.urlencode(args)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/6.0.0/lib/python2.6/urllib.py", line 1268, in urlencode
    v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

エラーメッセージで検索すると、

urllib.urlencode(dict([k, v.encode('utf-8')] for k, v in args.items()))

でいいと書いてあった。

unicodestr だけだったらこれでいいんだけど、今回のように数字とかが混じってると .encode メソッドが無いよと怒られるので、

urllib.urlencode(dict([k, v.encode('utf-8') if isinstance(v, unicode) else v] for k, v in args.items()))

とした。

>>> urllib.urlencode(dict([k, v.encode('utf-8') if isinstance(v, unicode) else v] for k, v in args.items()))
'foo=bar&piyo=123&hoge=%E3%81%BB%E3%81%92'

面倒だな。

トラックバック - http://python.g.hatena.ne.jp/edvakf/20101002
 |