前回に引き続きurllibの話です。
url文字列ははプロトコル、ホスト名、パス、パラメーターなど、いくつかの要素で成り立っています。
urllibを使うとURLの文字列から簡単に各要素を取り出せます。
使うのはurllib.parse.urlparse
です。
ドキュメント: urllib.parse.urlparse
使うのは簡単で、URLの文字列を渡すだけです。結果のオブジェクトのプロパティとして各要素を取り出せます。
次の形で分解してくれます。
URL: scheme://netloc/path;parameters?query#fragment
ドキュメントのページのURLを例にしてやってみましょう。
from urllib import parse
url = "https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlparse"
result = parse.urlparse(url)
# 結果はParseResultオブジェクト
print(result)
# ParseResult(scheme='https', netloc='docs.python.org', path='/3/library/urllib.parse.html', params='', query='', fragment='urllib.parse.urlparse')
# ホスト名
print(result.netloc)
# docs.python.org
# パス
print(result.path)
# /3/library/urllib.parse.html
上の例では存在しませんが、 query でパラメーターが渡されていた場合、その値をパースしたいこともよくあります。
それには、parse_qs
を使います。
ドキュメント: urllib.parse.parse_qs
もしくはparse_qsl
でも構いません。違いは出力が辞書かリストかです。
ドキュメント: urllib.parse.parse_qsl
パラメーターの多いyahoo ファイナンスさんのURLを拝借してやってみましょう。
url = "https://info.finance.yahoo.co.jp/history/?code=998407.O&sy=2021&sm=1&sd=12&ey=2021&em=1&ed=31&tm=d"
result = parse.urlparse(url)
# queryが取得できた
print(result.query)
# code=998407.O&sy=2021&sm=1&sd=12&ey=2021&em=1&ed=31&tm=d
# parse_qs でパースした結果
print(parse.parse_qs(result.query))
# {'code': ['998407.O'], 'sy': ['2021'], 'sm': ['1'], 'sd': ['12'], 'ey': ['2021'], 'em': ['1'], 'ed': ['31'], 'tm': ['d']}
# parse_qslでパースした結果
print(parse.parse_qsl(result.query))
# [('code', '998407.O'), ('sy', '2021'), ('sm', '1'), ('sd', '12'), ('ey', '2021'), ('em', '1'), ('ed', '31'), ('tm', 'd')]