URL操作したい(urllib.parse

1from urllib.parse import urlparse, urlsplit
2
3o = urlparse("https://example.com/path1/path2/path3.html?key1=value1&key2=value2#frag1)
4# o = urlsplit("https://example.com/path1/path2/path3.html?key1=value1&key2=value2#frag1)
5print(f"{o.scheme=}")  # https
6print(f"{o.netloc=}")  # example.com
7print(f"{o.path=}")    # /path1/path2/path3.html
8print(f"{o.query=}")    # key1=value1&key2=value2
9print(f"{o.fragment=}")    # frag1

urllib.parseは標準モジュールです。 urlparseurlsplitparse_qsといったURLやクエリを抽出するメソッドを持っています。 URLにアクセスすることなく、文字列操作できるのが便利です。

クエリを取り出したい(parse_qs / parse_qsl

1from urllib.parse import urlparse, parse_qs
2o = urlparse("https://example.com/path1/path2/path3.html?key1=value1&key2=value2#frag1)
3
4parse_qs(o.query)    # {"key1": ["value1"], "key2": ["value2"]}
5parse_qsl(o.query)   # [("key1", "value1"), ("key2", "value2")]

parse_qsでクエリを辞書型、 parse_qslでクエリをリスト型に変換できます。

1# 辞書型(parse_qs)
2response = requests.get(url="https://httpbin.org/get", params=parse_qs(o.query))
3
4# リスト型(parse_qsl)
5response = requests.get(url="https://httpbin.org/get", params=parse_qsl(o.query))

どちらの結果もrequestsparamsに直接渡すことができます。

クエリを文字列にしたい(urlencode

1from urllib.parse import urlencode
2
3q1 = {"key1": "value1", "key2": "value2"}
4q2 = [("key1", "value1"), ("key2": "value2")]
5
6urlencode(q1, doseq=True)  # key1=value1&key2=value2
7urlencode(q2, doseq=True)  # key1=value1&key2=value2

urlencodeで、辞書型/リスト型になっているクエリを文字列に変換できます。 doseq=Trueオプションが必須です。 parse_qs / parse_qslで取得したオブジェクトも復元できます。