有一个简单的解决方案使用
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 urlparseimport posixpathdef 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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)