Webアプリケーション開発やスクレイピングにおいて、URLの末尾にある ?key=value&... という形式のクエリパラメータを解析し、Pythonの辞書として扱いたい場合があります。
標準ライブラリ urllib.parse モジュールの parse_qs() 関数を使用すると、この変換を簡単に行えます。 特筆すべき点は、1つのキーに対して複数の値が存在する可能性を考慮し、辞書の値がすべて「リスト」として返されるという仕様です。
目次
実装例:書籍検索クエリの解析
ここでは、オンライン書店の検索URLに含まれるクエリ文字列(ジャンル、著者、フォーマットなど)をパースして、プログラム内で扱いやすいデータ形式に変換します。
ソースコード
from urllib import parse
# 1. 解析対象のクエリ文字列
# 通常はURLの '?' 以降の部分です
# 例: genre=mystery&author=Conan+Doyle&format=paperback&format=ebook
# ※ 'format' というキーが2回登場している点に注目してください
query_string = "genre=mystery&author=Conan+Doyle&format=paperback&format=ebook"
# 2. parse_qs() で辞書に変換
# URLエンコードされている部分(+ や %XX)も自動的にデコードされます
query_dict = parse.parse_qs(query_string)
print("--- 解析結果の辞書 ---")
print(query_dict)
print("\n--- 各値へのアクセス ---")
# 注意: 値は常に「リスト」として格納されています
# 値が1つの場合もリストなので、[0] で要素を取り出します
target_genre = query_dict["genre"][0]
print(f"ジャンル: {target_genre}")
# 著者名(URLエンコードされていたスペース等が復元されます)
target_author = query_dict["author"][0]
print(f"著者 : {target_author}")
# 同じキーに複数の値がある場合(リスト全体を取得)
formats = query_dict["format"]
print(f"形式 : {formats}")
実行結果
--- 解析結果の辞書 ---
{'genre': ['mystery'], 'author': ['Conan Doyle'], 'format': ['paperback', 'ebook']}
--- 各値へのアクセス ---
ジャンル: mystery
著者 : Conan Doyle
形式 : ['paperback', 'ebook']
解説
parse_qs(qs, keep_blank_values=False)
クエリ文字列(Query String)を受け取り、辞書を返します。
- 値がリストになる理由: URLの仕様上、
?id=1&id=2のように同じキーを複数指定することが許可されています。そのため、情報の欠落を防ぐために、値が1つだけであっても必ず['value']というリスト形式で格納されます。 - 値の取り出し方: 通常のパラメータ(値が1つとわかっているもの)を取得する場合は、
d['key'][0]のようにインデックスを指定して取り出す必要があります。 - keep_blank_values: デフォルトは
Falseで、値が空のパラメータ(例:&flag=&)は無視されます。Trueにすると、空文字を含むリストとして取得できます。
補足: parse_qsl()
もし辞書ではなく、[('key', 'val'), ('key', 'val2')] というタプルのリスト形式で順序通りに取得したい場合は、parse_qsl() 関数を使用します。
