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

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

PHP の rawurlencode() や JavaScript の encodeURI() のような URI (URL) を扱うための urllib.parse というライブラリが Python にも組み込みで用意されています。

import urllib.parse

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

基本的な使い方を以下に見ていきます。

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

URL をパースするには urllib.parse 内の関数 urlparse()parse_qs()unquote() などが役立ちます。

import urllib.parse

parsed = urllib.parse.urlparse("https://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('https://www.lifewithpython.com/abc/ruby.html', 'python.html')
# => 'https://www.lifewithpython.com/abc/python.html'

以上です。

参考