Python:使用urljoin的混淆

qkf9rpyu  于 2023-08-08  发布在  Python
关注(0)|答案(3)|浏览(80)

我试图从不同的片段形成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'

字符串
你能解释一下这个方法的确切行为吗?

nzrxty8p

nzrxty8p1#

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

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

字符串
根据我的描述,这是有道理的。虽然人们希望base包括一个方案和域。

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


如果您在vhost上,并且有一个像<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是/thing,你将链接到some/thing

weylhg0b

weylhg0b2#

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以/开头,它将base的scheme和netloc与url连接起来

>>>urljoin('http://a/b/c/d/e', '/f')
'http://a/f'

ncgqoxb0

ncgqoxb03#

一张图片胜过千言万语。

$ python3
Python 3.11.4 (main, Jun 20 2023, 17:23:00) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from urllib.parse import urljoin
>>> urljoin("http://a/b", "c/d")
'http://a/c/d'
>>> urljoin("http://a/b", "/c/d")
'http://a/c/d'
>>> urljoin("http://a/b/", "c/d")
'http://a/b/c/d'
>>> urljoin("http://a/b/", "/c/d")
'http://a/c/d'

字符串

最佳实践为

使用结尾带有斜杠(“/”)的“base”参数,避免使用斜杠(“/”)开始“url”参数。

相关问题