如何加入绝对和相对网址?

我有两个网址:

url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"

如何获得 url2的绝对 url?

118136 次浏览

你应使用 Urlparse.urljoin:

>>> import urlparse
>>> urlparse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

使用 Python 3(其中的 Urlparse 被重命名为 urllib.parse) ,您可以使用 用它来做下面的事情:

>>> import urllib.parse
>>> urllib.parse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'

很简单。

es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)

如果您的相对路径由多个部分组成,则必须分别加入它们,因为 urljoin将替换相对路径,而不是加入它。最简单的方法是使用 posixpath

>>> import urllib.parse
>>> import posixpath
>>> url1 = "http://127.0.0.1"
>>> url2 = "test1"
>>> url3 = "test2"
>>> url4 = "test3"
>>> url5 = "test5.xml"
>>> url_path = posixpath.join(url2, url3, url4, url5)
>>> urllib.parse.urljoin(url1, url_path)
'http://127.0.0.1/test1/test2/test3/test5.xml'

参见: 在用 Python 构造 URL 时,如何连接路径的组件

对于 python 3.0 + ,加入 urls 的正确方法是:

from urllib.parse import urljoin
urljoin('https://10.66.0.200/', '/api/org')
# output : 'https://10.66.0.200/api/org'

您可以使用 reduce实现 Shikhar 的方法在一个清洁的方式。

>>> import urllib.parse
>>> from functools import reduce
>>> reduce(urllib.parse.urljoin, ["http://moc.com/", "path1/", "path2/", "path3/"])
'http://moc.com/path1/path2/path3/'

注意,使用这种方法,每个片段都应该有后面的正斜杠,没有前面的正斜杠,以表明它是一个正在连接的路径片段。

这更正确/更有用,它告诉您 path1/是一个 URI 路径片段,而不是完整路径(例如 /path1/)或未知路径(例如 path1)。未知可以是其中之一,但是它们被作为完整路径处理。

如果需要在缺少 /的片段中添加 /,可以这样做:

uri = uri if uri.endswith("/") else f"{uri}/"

要了解更多关于 URI 解析的信息,维基百科提供了一些很好的示例。

最新情况

  • 刚刚注意到 Peter Perron 在 Shikhar 的回答中提到了 reduce,但是我会把这个留在这里来演示如何做到这一点。

  • 更新维基百科网址