Python

【Python】URLからクエリを取得する

MAX

GETリクエストをする場合、URLにqueryの情報が含まれている。

URLに含まれるqueryを辞書やリスト形式で取得する方法を説明する。

  1. URLをデコードする(必要に応じて)
  2. URLをparseする
  3. parseしたURLのqueryを利用しやすい形(辞書やリスト)にする
スポンサーリンク

URLをデコードする

URLのうち、英数字以外の文字は「%20」のような文字で表示されていることがある(エンコードされた状態)。

queryの内容を正しく知るために、「%20」のような文字を正しい文字に置き換える(デコード)

1from urllib.parse import quote, unquote
2
3encode_url = "https%3A//www.sample.com/index%3Fq1%3D111%26q2%3D222%26q3%3Da%20b%20c"
4decode_url = unquote(encode_url)
5print(decode_url)
6# 'https://www.sample.com/index?q1=111&q2=222&q3=a b c'

urllib.parseのunquoteでエンコードされたURLをデコードできる。(「%20」などを正しい文字に変換できる)

なお、URLをエンコードしたい場合はquoteを使う。

1from urllib.parse import quote, unquote
2
3sample_url = 'https://www.sample.com/index?q1=111&q2=222&q3=a b c'
4encode_url = quote(sample_url)
5print(encode_url)
6# 'https%3A//www.sample.com/index%3Fq1%3D111%26q2%3D222%26q3%3Da%20b%20c'

URLをparseする

URLをparseして、scheme, netloc, path, params, query, fragmentに分解する。

1from urllib.parse import urlparse, urlunparse
2
3sample_url = "https://www.sample.com/index?q1=111&q2=222&q3=a b c"
4parse_result = urlparse(sample_url)
5
6# scheme, netloc, path, params, query, fragmentをキーとして持つnamed tupleが返ってくる
7print(f"{parse_result}")
8# ParseResult(scheme='https', netloc='www.sample.com', path='/index', params='', query='q1=111&q2=222&q3=a b c', fragment='')
9
10# schemeやqueryを取得
11print(f"{parse_result.scheme=}")
12print(f"{parse_result.query=}")
13# parse_result.scheme='https'
14# parse_result.query='q1=111&q2=222&q3=a b c'

urlparseでURLをparseできる。

scheme, netloc, path, params, query, fragmentを持つNamed Tupleが返ってくる。

queryを辞書やリストにする

parseしたURLのquery部分を利用しやすいように、辞書やリストにする。

クエリ―を辞書にする

1from urllib.parse import urlparse
2
3sample_url = "https://www.sample.com/index?q1=111&q2=222&q3=a b c"
4parse_result = urlparse(sample_url)
5
6# queryを&で分割。更に=で分割。変数名をキー、値を値として辞書にする
7queries = dict([q.split("=") for q in parse_result.query.split("&")])
8print(queries)
9print(f"{queries.keys()=}")
10print(f"{queries.values()=}")
11print(f"{queries.items()=}")
12
13# {'q1': '111', 'q2': '222', 'q3': 'a b c'}
14# queries.keys()=dict_keys(['q1', 'q2', 'q3'])
15# queries.values()=dict_values(['111', '222', 'a b c'])
16# queries.items()=dict_items([('q1', '111'), ('q2', '222'), ('q3', 'a b c')])

queryは変数名と値が=でつながっており、複数の変数がある場合、各変数が&でつながっている。

なので、まずは&で分割し、その後=で分割することで変数名と値に分けられる。

クエリ―をリストにする

1from urllib.parse import urlparse
2
3sample_url = "https://www.sample.com/index?q1=111&q2=222&q3=a b c"
4parse_result = urlparse(sample_url)
5
6# queryを&で分割。更に=で分割。
7queries = [{q.split("=")[0]: q.split("=")[1]} for q in parse_result.query.split("&")]
8print(queries)
9print(f"{queries[0]=}")
10# [{'q1': '111'}, {'q2': '222'}, {'q3': 'a b c'}]
11# queries[0]={'q1': '111'}

分割方法は辞書と同じ。

最終的にどのように保持するかの問題なので、利用方法に合わせて保持すると良い。

まとめ

1from urllib.parse import urlparse, unquote
2
3sample_url = 'https%3A//www.sample.com/index%3Fq1%3D111%26q2%3D222%26q3%3Da%20b%20c'
4decode_url = unquote(sample_url)
5
6parse_result = urlparse(decode_url)
7queries = [{q.split("=")[0]: q.split("=")[1]} for q in parse_result.query.split("&")]

デコードしてパースしてクエリ―を分割して利用しやすい形にする。

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました