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


Answers:


213

您应该使用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'

5
我们如何urljoin与3或模式参数一起使用,或者您为此建议使用哪个库?
Mesut Tasci 2013年

@mesuutt尝试进行循环,并使用先前连接的URL连接每个部分。
塞德里克朱利安

2
@CédricJulien:一个简单的循环将不起作用,因为任何带有前导的路径/都会“重置”并返回方案+ netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion

如果使用urljoin,则存在问题。例如, urljoin('http://www.a.com/', '../../b/c.png')结果是'http://www.a.com/../../b/c.png',但不是http://www.a.com/b/c.png。那么,有什么方法可以得到http://www.a.com/b/c.png吗?
bigwind

1
链接到Python 3文档指向Python 2文档,它需要在答案中进行更新,它是docs.python.org/3.6/library/…–
Harsh

8

如果您的相对路径由多个部分组成,则必须单独连接它们,因为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时如何联接路径的组件


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

3
支持值列表的好方法。您可以通过使用reduce来消除副作用(“基本”变量)。reduce(lambda a, b: urlparse.urljoin(a, b), es) 一张地图是list[n] - to -> list[n]A reduce islist[n] - to -> a calculated value
Peter Perron '18

4
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'

简单。


3

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

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

1

您可以使用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解析的更多信息,请参阅Wikipedia。提供了一些很好的示例。

更新

只是注意到彼得·佩隆(Peter Perron)评论了Shikhar回答的减少,但是我将在这里留下来证明它是如何完成的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.