Mutlak ve göreceli URL'ler nasıl birleştirilir?


Yanıtlar:


214

Urlparse.urljoin kullanmalısınız :

>>> import urlparse
>>> urlparse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

Python 3 ile ( urlparse, urllib.parse olarak yeniden adlandırılır ) ile aşağıdaki gibi kullanabilirsiniz :

>>> import urllib.parse
>>> urllib.parse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

5
urljoin3 veya mod parametreleri ile nasıl kullanıyoruz veya bunun için hangi kütüphaneyi tavsiye ediyorsunuz?
Mesut Taşçı

@mesuutt bir döngü oluşturmaya ve her parçayı önceden birleştirilen URL ile birleştirmeye çalışın.
Cédric Julien

2
@ CédricJulien: Baştaki herhangi bir yol /"sıfırlayıp" şema + netloc + lasturl ile geri döneceğinden basit bir döngü çalışmayacaktır :urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion

Urljoin kullanıyorsanız, bir sorun var. Örneğin urljoin('http://www.a.com/', '../../b/c.png'), sonuç 'http://www.a.com/../../b/c.png', ancak değil http://www.a.com/b/c.png. Öyleyse, elde etmenin bir yolu var http://www.a.com/b/c.pngmı?
bigwind

1
Python 3 dokümantasyonuna bağlantı Python 2 dokümantasyonuna işaret ediyor, cevapta güncellenmesi gerekiyor, docs.python.org/3.6/library/…
Sert

8

Göreli yolunuz birden fazla parçadan oluşuyorsa, onları ayrı ayrı birleştirmeniz gerekir, çünkü urljoingöreli yolu birleştirmek yerine değiştirir. Bunu yapmanın en kolay yolu kullanmaktır 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'

Ayrıca bkz: Python'da bir URL oluştururken bir yolun bileşenlerini birleştirme


7
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)

3
Bir değerler listesini desteklemenin iyi bir yolu. Yine de bir azaltma kullanarak yan etkinizi ("temel" değişkeniniz) kaldırabilirsiniz. reduce(lambda a, b: urlparse.urljoin(a, b), es) Bir harita list[n] - to -> list[n]bir 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'

Basit.


3

Python 3.0+ için URL'leri birleştirmenin doğru yolu şudur:

from urllib.parse import urljoin
urljoin('https://10.66.0.200/', '/api/org')
# output : 'https://10.66.0.200/api/org'

1

reduceShikhar'ın yöntemini daha temiz bir şekilde elde etmek için kullanabilirsiniz .

>>> import urllib.parse
>>> from functools import reduce
>>> reduce(urllib.parse.urljoin, ["http://moc.com/", "path1/", "path2/", "path3/"])
'http://moc.com/path1/path2/path3/'

Bu yöntemle, her parçanın sonunda sağa eğik çizgi olmadan (birleştirilmekte olan bir yol parçası olduğunu belirtmek için) sonda eğik çizgi olması gerektiğini unutmayın. Bu daha doğru / bilgilendiricidir, size bunun path1/bir URI yol parçası olduğunu ve tam yol /path1/veya bilinmeyen olmadığını söyler path1, bu ikisi de olabilir (ve tam yol olarak kabul edilir).

/Eksik bir parçaya eklemeniz gerekirse şunları yapabilirsiniz:

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

URI çözünürlüğü hakkında daha fazla bilgi edinmek için, Wikipedia'nın bazı güzel örnekleri var.

Güncelleme

Peter Perron'un Shikhar'ın cevabını azaltma hakkında yorum yaptığını fark ettim, ancak bunun nasıl yapıldığını göstermek için bunu burada bırakacağım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.