PythonでWebスクレイピングを行うとき、URLを解析したり結合したり、エンコードしたりする必要がよくあります。そんなときに大活躍するのが、Python標準ライブラリのひとつである urllib.parse
モジュールです。
この記事では、urllib.parse
の基本的な使い方と具体的な活用方法を、初心者向けにわかりやすく解説します。
urllib.parseモジュールとは?
urllib.parse
は、URLを「部品」に分解して取得したり、逆にURLを組み立てたり、URLの中に使われている特殊文字(日本語や記号など)をエンコード(変換)するためのモジュールです。
例えば、以下のようなことができます:
- URLのクエリ文字列を辞書に変換/作成
- URLをスキームやドメイン、パスなどに分割
- ベースURLと相対パスを結合して絶対パスに変換
URLを解析する ⇒ urlparse()
まずは、URLの各パーツを確認してみましょう。
使用例
from urllib.parse import urlparse
url = 'https://www.hobby-happymylife.com/'
parsed = urlparse(url)
print(parsed)
出力結果
ParseResult(scheme='https', netloc='www.hobby-happymylife.com', path='/', params='', query='', fragment='')
解説
属性名 | 意味 | 例 |
---|---|---|
scheme | プロトコルの種類 | https 、http など |
netloc | ドメイン+ポート | www.example.com |
path | URLのパス部分 | /articles/index.html |
params | パスに対する追加情報 | (ほとんど使わない) |
query | クエリパラメータ | ?page=1 など |
fragment | ハッシュ(#)以降の部分 | #section1 |
ちょっと便利な属性も!
parsed.hostname
: ホスト名(小文字)parsed.port
: ポート番号(あれば)parsed.username
,parsed.password
: 認証情報(あれば)
相対パスを結合する ⇒ urljoin
Webページ上のリンクや画像のURLは、しばしば相対パスになっています。
そのときに、ベースURL(ホームURL)と相対パスを結合して完全なURLを作るのが urljoin()
です。
使用例
from urllib.parse import urljoin
base_url = 'https://www.hobby-happymylife.com/'
url_python = urljoin(base_url, '%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/python/')
url_img = urljoin(base_url, '/wp-content/uploads/2020/01/sample.png')
print(url_python)
print(url_img)
出力結果
https://www.hobby-happymylife.com/プログラミング/python/
https://www.hobby-happymylife.com/wp-content/uploads/2020/01/sample.png
ポイント:
相対パスを絶対パスに変換して、正しいURLを取得できます。
スクレイピングで画像URLやリンクを取得するときに便利!
クエリパラメータのエンコード ⇒ urlencode()
検索フォームやログインなど、URLの末尾に「?name=hoge&page=1」といった文字列を付ける場面では、辞書データをURL形式の文字列に変換する必要があります。
それをやってくれるのが urlencode()
です。
使用例
from urllib.parse import urlencode
params = {
"name": "田中", # 日本語もOK
"page": 3
}
encoded = urlencode(params)
print(encoded)
出力結果
name=%E7%94%B0%E4%B8%AD&page=3
これは、URLに使える文字に変換された「URLエンコードされた文字列」です。
url = "https://example.com/search?" + encoded
print(url)
# https://example.com/search?name=%E7%94%B0%E4%B8%AD&page=3
ポイント:
- 日本語や記号を安全にURLに含めるにはエンコードが必要
urlencode()
は辞書を受け取り、URL用に自動変換してくれる
エラーに注意!
urlparse()
の戻り値はタプルに似ていますが、ParseResult
なので属性アクセスがおすすめ。urljoin()
の第2引数が絶対パス(http://から始まる)だと、ベースURLが無視されることに注意。urlencode()
は辞書しか受け取れません。リストやタプルの場合は変換が必要です。
まとめ
機能 | 関数 | 説明 |
---|---|---|
URLを解析 | urlparse() | URLの構成要素を取得 |
URLを結合 | urljoin() | ベースURL + 相対パスで完全なURL |
クエリを生成 | urlencode() | 辞書をURL形式の文字列に変換 |
関連記事リンク
これからスクレイピングの勉強を始めたい方には以下の書籍がおすすめです。基本的な技術やサンプルコードが多くあるので、勉強がし易いです。