【Windows】Pythonをインストールする
MAX
MAX999blog
GETリクエストをする場合、URLにqueryの情報が含まれている。
URLに含まれるqueryを辞書やリスト形式で取得する方法を説明する。
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して、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が返ってくる。
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("&")]
デコードしてパースしてクエリ―を分割して利用しやすい形にする。