Python で URL パラメーターの文字列を辞書に変換する:parse_qsl と parse_qs の違い

URL のパラメーター文字列は parse_qsl でタプルのリストにできます。これを辞書型にキャストすれば辞書データが得られます。

from urllib.parse import parse_qsl

text = "name=佐藤&age=30&skill=Python&skill=SQL&active=true"

parsed = parse_qsl(text)

print(type(parsed))
# <class 'list'>

print(parsed)
# [('name', '佐藤'), ('age', '30'), ('skill', 'Python'), ('skill', 'SQL'), ('active', 'true')]

data = dict(parsed)

print(data)
# {'name': '佐藤', 'age': '30', 'skill': 'SQL', 'active': 'true'}
最後の dict でタプルの __('skill', 'Python')__ が消えていますね。これが parse_qsl の問題です。

同じキーをもつ値をすべて漏れなく取得するには parse_qs を使います。先の関数 parse_qsl と似ていて、まぎらわしいです。

from urllib.parse import parse_qs

text = "name=佐藤&age=30&skill=Python&skill=SQL&active=true"

parsed = parse_qs(text)

print(type(parsed))
# <class 'dict'>

print(parsed)
# {'name': ['佐藤'], 'age': ['30'], 'skill': ['Python', 'SQL'], 'active': ['true']}

なんとこの関数、一発で辞書を返します。ただ、キーに対応する値はリストです。