PythonでURLをパース・エンコード・デコード(urllib.parse)
この記事では、Pythonの`urllib.parse`モジュールを使ってURLをパース、エンコード、デコードする方法を解説します。URLの各コンポーネントへのアクセス、クエリパラメータの操作、URLのエンコードとデコード、そして実践的な例を通して理解を深めます。
目次
- URLの解析 (parse_qs, urlparse)
- クエリパラメータの操作
- URLのエンコード (quote, quote_plus)
- URLのデコード (unquote, unquote_plus)
- 実践例
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¶m2=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を動的に生成しています。
関連記事
- Pythonで文字列をエンコード・デコード(encode, decode)
- Pythonで文字列をバイト列に変換(encode)
- Pythonでバイト列を文字列に変換(decode)
- PythonでHTTPリクエストを送信(requests, urllib.request)
- PythonでURLをパース・エンコード・デコード(urllib.parse)
- Pythonで文字列をフォーマット(format, f文字列 (Python 3.6以降), %演算子)
- Pythonで辞書をJSONに変換(json.dumps)
- PythonでJSONを辞書に変換(json.loads)
- PythonでConfigファイルを読み書き (configparser)
- Pythonでファイルのエンコーディングを指定して読み書き