Pythonでurl文字列の結合・分解等の処理を行う方法

環境

  • Windows 10
  • Python 3.10.1

結論

urllib.parseモジュールを使用する

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

実装

urlの分解

  • urlparseメソッドを使用する
  • URLを6つの構成要素に分解(返り値は6つの構成要素のタプル)することが可能
  • 各要素はそれぞれ、[scheme]:// [netloc] / [path] ; [parameters] ? [query] # [fragment]のようになる

shared\Domain\xurl.py

from urllib.parse import urlparse
from urllib.parse import urljoin


# URLを6つの構成要素に分解(返り値は6つの構成要素のタプル)
# [scheme]:// [netloc] / [path] ; [parameters] ? [query] # [fragment]
class XUrl:
    def __init__(self, href):
        self.href = href

    def get_href(self):
        return self.href

    def get_scheme(self):
        return urlparse(self.href).scheme

    def get_netloc(self):
        return urlparse(self.href).netloc

    def get_path(self):
        return urlparse(self.href).path

    def get_params(self):
        return urlparse(self.href).params

    def get_query(self):
        return urlparse(self.href).query

    def get_fragment(self):
        return urlparse(self.href).fragment

    def get_baseurl(self):
        return self.get_scheme() + self.get_netloc()

urlの結合

  • urljoinメソッドでurlの結合が可能

shared\Domain\xurl.py

from urllib.parse import urlparse
from urllib.parse import urljoin


class XUrl:
    def __init__(self, href):
        self.href = href

    def get_href(self):
        return self.href

    def get_scheme(self):
        return urlparse(self.href).scheme

    def get_netloc(self):
        return urlparse(self.href).netloc

    ...割愛

    def get_baseurl(self):
        return f"{self.get_scheme()}://{self.get_netloc()}/"

    # 基底URLと相対URLを組み合わせて絶対URLを生成します
    def join_to(self, relative_path):
        return urljoin(self.get_baseurl(), relative_path)

呼び出し側

tests\test_xurl.py

import pytest
from shared.Domain.xurl import XUrl

@pytest.fixture
def setuped_xurl():
    xurl = XUrl("https://maasaablog.com/development/python/3795/#toc2")
    return xurl

def test_対象のurlからスキーマのみ取得できること(setuped_xurl: XUrl):
    assert setuped_xurl.get_scheme() == "https"

def test_対象のurlからnetlocのみ取得できること(setuped_xurl: XUrl):
    assert setuped_xurl.get_netloc() == "maasaablog.com"

def test_対象のurlからpathのみ取得できること(setuped_xurl: XUrl):
    assert setuped_xurl.get_path() == "/development/python/3795/"

def test_対象のurlからパラメータのみ取得できること(setuped_xurl: XUrl):
    assert setuped_xurl.get_params() == ""

def test_対象のurlからfragmentのみ取得できること(setuped_xurl: XUrl):
    assert setuped_xurl.get_fragment() == "toc2"

def test_基底パスを取得できること(setuped_xurl: XUrl):
    assert setuped_xurl.get_baseurl() == "https://maasaablog.com/"

def test_基底パスと相対パスを結合できること(setuped_xurl: XUrl):
    assert setuped_xurl.join_to("hoge") == "https://maasaablog.com/hoge"

以上です

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2022/08/04 17:32時点)
タイトルとURLをコピーしました