PYTHON MEBY

PythonでURLをパース・エンコード・デコード(urllib.parse)

この記事では、Pythonの`urllib.parse`モジュールを使ってURLをパース、エンコード、デコードする方法を解説します。URLの各コンポーネントへのアクセス、クエリパラメータの操作、URLのエンコードとデコード、そして実践的な例を通して理解を深めます。

目次

URLの解析 (parse_qs, urlparse)

`urllib.parse.urlparse`はURL文字列を解析し、scheme, netloc, path, params, query, fragmentといったコンポーネントに分割します。`urllib.parse.parse_qs`はクエリ文字列を辞書形式に変換します。

from urllib.parse import urlparse, parse_qs
url = "https://example.com/path/to/page?param1=value1&param2=value2#fragment"
parsed_url = urlparse(url)
print(parsed_url)
query_params = parse_qs(parsed_url.query)
print(query_params)

`urlparse`はParseResultオブジェクトを返し、各コンポーネントにアクセスできます。`parse_qs`はクエリパラメータを辞書として返します。値が複数ある場合はリストとして格納されます。

クエリパラメータの操作

`urllib.parse.urlencode`は辞書をクエリ文字列に変換します。

from urllib.parse import urlencode
params = {"param1": "value1", "param2": ["value2a", "value2b"]}
query_string = urlencode(params)
print(query_string)

リストの値はURLエンコードされた後、同じキーで複数回追加されます。

URLのエンコード (quote, quote_plus)

`urllib.parse.quote`と`urllib.parse.quote_plus`はURLセーフではない文字をエンコードします。`quote_plus`はスペースを'+'でエンコードします。

from urllib.parse import quote, quote_plus
text = "こんにちは 世界"
encoded_text = quote(text)
encoded_text_plus = quote_plus(text)
print(encoded_text)
print(encoded_text_plus)

エンコードされた文字列はURLに直接使用できます。

URLのデコード (unquote, unquote_plus)

`urllib.parse.unquote`と`urllib.parse.unquote_plus`はエンコードされたURLをデコードします。`unquote_plus`は'+'をスペースにデコードします。

from urllib.parse import unquote, unquote_plus
encoded_text = "%E3%81%B3%E3%81%8B%E3%81%97%E3%81%A3%E3%81%B6%20%E4%B8%96%E7%95%8C"
encoded_text_plus = "%E3%81%B3%E3%81%8B%E3%81%97%E3%81%A3%E3%81%B6+%E4%B8%96%E7%95%8C"
decoded_text = unquote(encoded_text)
decoded_text_plus = unquote_plus(encoded_text_plus)
print(decoded_text)
print(decoded_text_plus)

デコードされた文字列は元の文字列に戻ります。

実践例

WebスクレイピングやAPIとの連携で、`urllib.parse`は必須のモジュールです。複雑なURLを扱う場合でも、このモジュールを使うことで安全かつ効率的に処理できます。

from urllib.parse import urlencode, urljoin
base_url = "https://example.com/api"
params = {"key": "your_api_key", "param": "value"}
url = urljoin(base_url, "?" + urlencode(params))
print(url)

この例では、APIエンドポイントURLを動的に生成しています。

関連記事