2016/07/18

Python Tips: URL エンコード・デコードがしたい

Python で URL エンコード/デコードをする方法をご紹介します。

Python にも PHP の rawurlencode() や JavaScript の encodeURI() のような URI(URL) に関わる処理を行うためのライブラリが用意されています。 urllib.parse です( Python 3 の場合。 Python 2 の場合は urllib 直下に関数があります)。

import urllib.parse

urllib は標準ライブラリなので pip などで別途インストールする必要はありません。 Python をインストールするとすぐに使うことができます。

主な使い方を以下にかんたんに見ていきます。

URL をパース/デコードする


urllib.parse 内の urldecode() や parse_qs() 、 unquote() などが役立ちます。

import urllib.parse

parsed = urllib.parse.urldecode("http://www.lifewithpython.com/2015/01/02?m=1&tag=goto%27s")

parsed.scheme  => 'http'
parsed.hostname  => 'www.lifewithpython.com'
parsed.path  => '/2015/01/02'
parsed.query  => 'm=1&tag=goto%27s'

query = urllib.parse.parse_qs(parsed.query)
query  => {'m': ['1'], 'tag': ["goto's"]}

tag_value = urllib.parse.unquote('goto%27s')
tag_value  => "goto's"

ルールは RFC 1808 、 RFC 3986 などに基づくとされています。正確な処理が求められるところでは、ルールについて詳細を確認しておくとよいでしょう。

URL をエンコードする


パースとは逆にエンコードする場合です。

こちらは urllib.parse の urlencode() や quote() 、 urljoin() などを使用します。

import urllib.parse

urllib.parse.urlencode({'a': "goto's", 'b': '?foo bar'})
# => 'a=goto%27s&b=%3Ffoo+bar'

urllib.parse.quote('goto's')
# => 'goto%27s'

urllib.parse.urljoin('http://www.lifewithpython.com/abc/ruby.html', 'python.html')
# => 'http://www.lifewithpython.com/abc/python.html'

以上です。便利ですねー。

このあたりを自分で実装するとなるとかなり大変かと思うですが、ひととおり揃っているので助かります。ちょっとしたときにサッと使えるようになっておくと重宝するかと思います。


参考
- urllib.parse — Parse URLs into components — Python 公式ドキュメント

0 件のコメント: