有一个简单的解决方案使用urllib.parse.urljoin
:
>>> from urllib.parse import urljoin
>>> urljoin('http://www.example.com/foo/bar/../../baz/bux/', '.')
'http://www.example.com/baz/bux/'
但是,如果没有结尾斜杠(最后一个组件是文件,而不是目录),则最后一个组件将被删除。
此修复程序使用urlparse函数提取路径,然后使用(的posixpath版本)os.path
对组件进行规范化。用斜杠补偿一个神秘的问题,然后将URL重新连接在一起。以下是doctest
能够的:
from urllib.parse import urlparse
import posixpath
def resolve_components(url):
"""
>>> resolve_components('http://www.example.com/foo/bar/../../baz/bux/')
'http://www.example.com/baz/bux/'
>>> resolve_components('http://www.example.com/some/path/../file.ext')
'http://www.example.com/some/file.ext'
"""
parsed = urlparse(url)
new_path = posixpath.normpath(parsed.path)
if parsed.path.endswith('/'):
# Compensate for issue1707768
new_path += '/'
cleaned = parsed._replace(path=new_path)
return cleaned.geturl()