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'
以上です。