絶対URLと相対URLを結合する方法は?


回答:


212

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
urljoin3またはモードのパラメーターをどのように使用するか、またはどのライブラリーをこれに推奨しますか?
Mesut Tasci 2013

@mesuuttはループを作成し、各パーツを以前に結合されたURLに結合しようとします。
セドリックジュリアン

2
単純なループ動作しません、大手との任意のパスのように:CédricJulien@ /:意志「リセット」とラストURL戻りスキーム+ netloc +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 2014

1
Pythonの2ドキュメントへのPython 3のドキュメント・ポイントへのリンクは、それが答えで更新する必要がある、それはdocs.python.org/3.6/library/...
過酷

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]リデュースですlist[n] - to -> a calculated value
Peter Perron

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以降の場合、URLを結合する正しい方法は次のとおりです。

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/またはunknownのpath1いずれかではありません(フルパスとして扱われます)ではありません。

/欠けているフラグメントに追加する必要がある場合は、次のようにすることができます。

uri = uri if uri.endswith("/") else f"{uri}/"

URI解決について詳しく知るために、Wikipediaにはいくつかの素晴らしい例があります。

更新

Peter PerronがShikharの回答の削減についてコメントしたことに気づくだけですが、それをここに残して、それがどのように行われるかを示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.