Pythonでurl文字列をエンコード・デコードする方法

環境

  • Windows 10
  • Python 3.10.1

結論

urllibモジュールのparse.quoteとparse.unquoteメソッドを使用する

実装

エンコード

呼び出し側

  • エンコードしたいurl文字列のオブジェクトを作成し、EncodeUrlServiceに渡す

tests\test_encode_url_service.py

import pytest
from shared.Domain.xurl import XUrl
from shared.Application.encode_url_service import EncodeUrlService

@pytest.fixture
def setuped_xurl():
    xurl = XUrl("https://hoge.com/doc/2021/06/20210616004/売り上げ管理書.pdf")
    return xurl

def test_urlをエンコードできること(setuped_xurl: XUrl):
    encoded_url = EncodeUrlService().execute(setuped_xurl)
    assert (
        encoded_url
        == "https%3A//hoge.com/doc/2021/06/20210616004/%E5%A3%B2%E3%82%8A%E4%B8%8A%E3%81%92%E7%AE%A1%E7%90%86%E6%9B%B8.pdf"
    )

# オプション引数safeはクオートしたくないASCII文字を指定できる(デフォルトは、"/")
def test_エンコードしない文字を指定しつつurlをエンコードできること(setuped_xurl: XUrl):
    encoded_url = EncodeUrlService().execute(setuped_xurl, not_escape_ascii="/:")
    assert (
        encoded_url
        == "https://hoge.com/doc/2021/06/20210616004/%E5%A3%B2%E3%82%8A%E4%B8%8A%E3%81%92%E7%AE%A1%E7%90%86%E6%9B%B8.pdf"
    )

shared\Application\encode_url_service.py

  • urllib.parse.quoteメソッドに、urlを渡すとエンコード可能
  • 第二引数にエスケープしたくない文字列を指定することが可能(今回はデフォルトの”/”に加え、:(コロン)も指定している)
from shared.Domain.xurl import XUrl
from shared.Domain.ximage import XImage
import urllib.parse

# 特殊文字を%エスケープを使った文字に置き換え
class EncodeUrlService:
    def execute(self, xurl: XUrl, not_escape_ascii="/"):
        return urllib.parse.quote(xurl.get_href(), safe=not_escape_ascii)

デコード

呼び出し側

  • デコードしたいurl文字列のオブジェクトを作成し、DecodeUrlServiceに渡す

tests\test_decode_url_service.py

import pytest
from shared.Domain.xurl import XUrl
from shared.Application.decode_url_service import DecodeUrlService

@pytest.fixture
def setuped_xurl():
    xurl = XUrl("https%3A//hoge.com/doc/2021/06/20210616004/%E5%A3%B2%E3%82%8A%E4%B8%8A%E3%81%92%E7%AE%A1%E7%90%86%E6%9B%B8.pdf")
    return xurl

def test_urlをデコードできること(setuped_xurl: XUrl):
    decoded_url = DecodeUrlService().execute(setuped_xurl)
    assert (
        decoded_url
        == "https://hoge.com/doc/2021/06/20210616004/売り上げ管理書.pdf"
    )

shared\Application\encode_url_service.py

  • urllib.parse.unquoteメソッドに、urlを渡すとデコード可能
import urllib.parse
from shared.Domain.xurl import XUrl

# エスケープされた %xx をそれに対応した単一文字に置き換え
class DecodeUrlService:
    def execute(self, xurl: XUrl):
        return urllib.parse.unquote(xurl.get_href())

以上です

Python学習におすすめの書籍

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