WebスクレイピングやAPI連携の処理において、1つの長いURL文字列から「ドメイン名だけ」や「クエリパラメータだけ」を抜き出したい場合があります。
Pythonの標準ライブラリ urllib.parse モジュールにある urlparse() 関数を使用すると、URLを6つの構成要素に分解(パース)して簡単に取得できます。
目次
ParseResultオブジェクトの主要属性
urlparse() 関数が返すオブジェクト(ParseResult)が持つ、主要な属性とその意味は以下の通りです。
| 属性名 | 概要 | 抽出される部分の例 |
scheme | プロトコル(スキーム) | https, http |
netloc | ネットワーク上の位置(ドメイン/ホスト名) | www.example.com, api.server:8080 |
path | ドメイン以下のファイルパス | /articles/search, /index.html |
query | クエリ文字列(パラメータ) | q=python&page=1 |
実装例:検索URLの解析
ここでは、架空の不動産検索サイトのURLを対象に、その構成要素を分解して個別に表示するコードを実装します。
ソースコード
from urllib import parse
# 解析対象のURL(架空の物件検索URL)
# 構成: プロトコル://ドメイン/パス?クエリパラメータ
property_search_url = "https://realestate.example.co.jp/rent/tokyo/search?min_price=50000&max_price=80000&layout=1K"
# 1. URLをパース(解析)する
# urlparse(URL文字列) を実行すると、ParseResultオブジェクトが返されます
parsed_data = parse.urlparse(property_search_url)
# 2. 解析結果の全体像を確認
print(f"解析オブジェクト: {parsed_data}")
print("-" * 40)
# 3. 各属性(プロパティ)へアクセスして値を取り出す
print(f"プロトコル (scheme) : {parsed_data.scheme}")
print(f"ドメイン (netloc) : {parsed_data.netloc}")
print(f"パス (path) : {parsed_data.path}")
print(f"クエリ (query) : {parsed_data.query}")
# おまけ: クエリパラメータをさらに辞書として扱いたい場合
# parse_qs を使うと {'min_price': ['50000'], ...} の形式に変換できます
query_dict = parse.parse_qs(parsed_data.query)
print("-" * 40)
print(f"クエリ辞書化 : {query_dict}")
実行結果
解析オブジェクト: ParseResult(scheme='https', netloc='realestate.example.co.jp', path='/rent/tokyo/search', params='', query='min_price=50000&max_price=80000&layout=1K', fragment='')
----------------------------------------
プロトコル (scheme) : https
ドメイン (netloc) : realestate.example.co.jp
パス (path) : /rent/tokyo/search
クエリ (query) : min_price=50000&max_price=80000&layout=1K
----------------------------------------
クエリ辞書化 : {'min_price': ['50000'], 'max_price': ['80000'], 'layout': ['1K']}
解説
urlparse(): URLを構造的に分解するための関数です。戻り値はタプルのような性質を持つParseResultクラスのインスタンスで、属性名(.schemeなど)でもインデックス([0]など)でもアクセス可能です。- 用途: リダイレクト先のドメインチェック、画像URLからのファイル名抽出、APIリクエスト時のパラメータ書き換えなどで頻繁に使用されます。
- 注意点: URLとして不完全な文字列(例:
example.com/fooのようにhttps://がないもの)を渡すと、正しく解析できない場合があります。その場合はschemeが空文字になったり、パスとして認識されたりします。
