【问题标题】:Python: confusions with urljoinPython:与 urljoin 混淆
【发布时间】:2012-06-05 07:34:50
【问题描述】:

我正在尝试从不同的部分形成 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'

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

【问题讨论】:

  • 遇到这个问题的人请注意:上面的 import 语句适用于 Python 3.x。对 python 2.x 使用“from urlparse import urljoin”。

标签: python python-3.x


【解决方案1】:

(对我来说)最好的方法是第一个参数,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 是/thing,您将链接到some/thing

【讨论】:

  • 感谢您的解释...这种行为使寻找“真实”urljoin,行为类似于os.path.join
  • 对于那些只想在另一个上添加一个 url 的人,没有 urljoin 的逻辑,posixpath.join() 可能适合你。
  • 我喜欢urljoin('http://', 'some/', 'thing') 的结局:'http:///some/'¯\_(ツ)_/¯
  • @seb urljoin 不是可变参数,第三个参数是布尔标志
  • 谢谢,我明白了。但是,“///”还是很奇怪。
【解决方案2】:

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'

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2015-05-29
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多