前回の記事がURL文字列の各要素への分解だったので、今回は逆に構築です。
まずはクエリパラメーター(クエリストリング)部分についてです。
今更説明するまではないのですが、クエリパラメーターはキーと値を=(イコール)で結び、さらにそれらを&で繋いでいきます。
自分で実装すると地味に手間なのですが、これもurllibに実装があります。
それが urllib.parse.urlencode です。
試しにやってみます。
from urllib import parse
qs = parse.urlencode(
{
"key1": "キー1",
"value1": "値1",
"id": "123"
}
)
print(qs)
# key1=%E3%82%AD%E3%83%BC1&value1=%E5%80%A41&id=123
この例で気づかれたと思いますが、このメソッド、とても気の利いてることにパーセントエンコーディングもやってくれます。
辞書の他に、(キー, 値)のタプルの配列も引数として受け取ってくれます。
qs = parse.urlencode(
[
("key1", "キー1"),
("value1", "値1"),
("id", "123")
]
)
print(qs)
# key1=%E3%82%AD%E3%83%BC1&value1=%E5%80%A41&id=123
クエリパラメーターの文字列を構築するのに、非常に便利ですね。
もう一つ、プロトコルやホスト名、パスなどからURL全体を構築するメソッドもあります。
それが、 urllib.parse.urlunparse です。
scheme, netloc, path, parameters, query, fragment の 6要素のタプルを受け取り、
scheme://netloc/path;parameters?query#fragment の形に結合してくれます。
タプルないの要素は省略は不可で、それを含まないようなURLを作るときは空白文字列を入れないといけません。
正直、そこまで便利には感じませんでした。
一応やってみた例です。
print(
parse.urlunparse(
(
"https",
"analytics-note.xyz",
"",
"",
"s=統計学",
"",
)
)
)
# https://analytics-note.xyz?s=統計学
上の例で分かる通り、クエリストリングはパーセントエンコーディングやってくれません。
そのため、クエリパラメーターに日本語を含む場合は本当は事前に何らかの手段でパーセントエンコーディングしておく必要があります。
urlunparse はそこまで使うメリットがなさそうなので、単純に文字列の結合を実装しても良さそうです。