99

我正在尝试从不同的部分形成 URL,并且无法理解此方法的行为。例如:

Python 3.x

from urllib.parse import urljoin

>>> urljoin('some', 'thing')
'thing'
>>> urljoin('http://some', 'thing')
'http://some/thing'
>>> urljoin('http://some/more', 'thing')
'http://some/thing'
>>> urljoin('http://some/more/', 'thing') # just a tad / after 'more'
'http://some/more/thing'
urljoin('http://some/more/', '/thing')
'http://some/thing'

你能解释一下这种方法的确切行为吗?

4

2 回答 2

123

(对我来说)考虑这一点的最佳方式是第一个参数,base就像您在浏览器中所在的页面一样。第二个参数url是该页面上锚点的 href。结果是您单击后将被定向到的最终 URL。

>>> urljoin('some', 'thing')
'thing'

鉴于我的描述,这是有道理的。虽然有人希望 base 包括一个方案和域。

>>> urljoin('http://some', 'thing')
'http://some/thing'

如果你在一个虚拟主机上,并且有一个像这样的锚点,<a href='thing'>Foo</a>那么链接将带你到http://some/thing

>>> urljoin('http://some/more', 'thing')
'http://some/thing'

我们在some/more这里,所以一个相对链接thing将带我们到/some/thing

>>> urljoin('http://some/more/', 'thing') # just a tad / after 'more'
'http://some/more/thing'

在这里,我们不在some/more,我们在some/more/不同的地方。现在,我们的相对链接将带我们到some/more/thing

>>> urljoin('http://some/more/', '/thing')
'http://some/thing'

最后。如果打开some/more/并且 href 是 to /thing,您将被链接到some/thing.

于 2012-06-05T07:39:46.220 回答
8

urllib.parse.urljoin(base, url )

如果 url 是绝对 URL(即,以 //、http://、https://、...开头),则 url 的主机名和/或方案将出现在结果中。例如:

>>> urljoin('https://www.google.com', '//www.microsoft.com')
'https://www.microsoft.com'
>>>

否则,urllib.parse。urljoin (base, url) 将

通过将“基本 URL”(base)与另一个 URL(url)组合来构造一个完整(“绝对”)的 URL。非正式地,这使用基本 URL 的组件,特别是寻址方案、网络位置和(部分)路径,以提供相对 URL 中缺少的组件。

>>> urlparse('http://a/b/c/d/e')
ParseResult(scheme='http', netloc='a', path='/b/c/d/e', params='', query='', fragment='')
>>> urljoin('http://a/b/c/d/e', 'f')
>>>'http://a/b/c/d/f'
>>> urlparse('http://a/b/c/d/e/')
ParseResult(scheme='http', netloc='a', path='/b/c/d/e/', params='', query='', fragment='')
>>> urljoin('http://a/b/c/d/e/', 'f')
'http://a/b/c/d/e/f'
>>>

它获取第一个参数(base)的路径,剥离最后一个 / 之后的部分并与第二个参数(url)连接。

如果url以/开头,则用url加入base的scheme和netloc

>>>urljoin('http://a/b/c/d/e', '/f')
'http://a/f'
于 2018-07-27T09:53:55.527 回答