İki url’im var:
url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"
Url2 için nasıl mutlak bir url alabilirim?
İki url’im var:
url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"
Url2 için nasıl mutlak bir url alabilirim?
Yanıtlar:
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'
urljoin
3 veya mod parametreleri ile nasıl kullanıyoruz veya bunun için hangi kütüphaneyi tavsiye ediyorsunuz?
/
"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'
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.png
mı?
Göreli yolunuz birden fazla parçadan oluşuyorsa, onları ayrı ayrı birleştirmeniz gerekir, çünkü urljoin
gö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
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)
reduce(lambda a, b: urlparse.urljoin(a, b), es)
Bir harita list[n] - to -> list[n]
bir list[n] - to -> a calculated value
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'
Basit.
reduce
Shikhar'ı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.