1. ホーム
  2. python

[解決済み] Python: urljoinの混乱

2022-03-02 04:53:39

質問

異なるパーツから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'

このメソッドの具体的な動作について教えてください。

どのように解決するのですか?

(私にとって)一番良い考え方は、第1引数です。 base は、あなたがブラウザで見ているページのようなものです。 第2引数の url は、そのページ上のアンカーの href です。 その結果は、クリックしたときに表示される最終的なURLです。

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

これは私の説明からして納得がいくものです。 しかし、ベースにはスキームとドメインが含まれていることを期待したいところです。

>>> 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 .