環境
- 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でurl文字列をエンコード・デコードする方法について紹介しています。ぜひ参考にしてみてください