【Python】URLのクエリパラメータをパースして辞書(dict)に変換する方法

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() 関数を使用します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次