Jak dołączyć bezwzględne i względne adresy URL?


Odpowiedzi:


214

Powinieneś użyć urlparse.urljoin :

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

W Pythonie 3 (gdzie urlparse została zmieniona na urllib.parse ) możesz go użyć w następujący sposób :

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

5
Jak używamy urljoinz parametrami 3 lub trybami lub którą bibliotekę polecacie do tego?
Mesut Tasci

@mesuutt spróbuj utworzyć pętlę i połączyć każdą część z wcześniej dołączonym adresem URL.
Cédric Julien

2
@ CédricJulien: prosta pętla nie zadziała, ponieważ każda ścieżka z /początkiem spowoduje „zresetowanie” i powrót schematu + netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion

Jeśli używasz urljoin, występuje problem. Na przykład urljoin('http://www.a.com/', '../../b/c.png')wynik to 'http://www.a.com/../../b/c.png', ale nie http://www.a.com/b/c.png. Czy jest więc jakaś metoda http://www.a.com/b/c.png?
bigwind

1
Link do punktów Python 3 do dokumentacji Python dokumentacji 2, musi ona aktualizowana w odpowiedzi, to docs.python.org/3.6/library/...
Harsh

8

Jeśli twoja ścieżka względna składa się z wielu części, musisz połączyć je oddzielnie, ponieważ urljoinzastąpiłoby to ścieżkę względną, a nie dołączyło do niej. Najłatwiej to zrobić, używając 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'

Zobacz także: Jak łączyć składniki ścieżki podczas tworzenia adresu URL w Pythonie


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

3
Dobry sposób na obsługę listy wartości. Możesz jednak usunąć efekt uboczny (zmienną „bazową”), używając redukcji. reduce(lambda a, b: urlparse.urljoin(a, b), es) Mapa to list[n] - to -> list[n]Redukcja tolist[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'

Prosty.


3

W przypadku Pythona 3.0+ prawidłowym sposobem dołączania adresów URL jest:

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

1

Możesz użyć, reduceaby osiągnąć metodę Shikhara w czystszy sposób.

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

Zauważ, że w tej metodzie każdy fragment powinien mieć końcowy ukośnik, bez poprzedzającego ukośnika (aby wskazać, że jest to łączony fragment ścieżki). Jest to bardziej poprawne / pouczające, mówiąc ci, że path1/jest to fragment ścieżki URI, a nie pełna ścieżka /path1/lub nieznana path1, która może być albo (i jest traktowana jako pełna ścieżka).

Jeśli chcesz dodać /do brakującego fragmentu, możesz zrobić:

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

Aby dowiedzieć się więcej o rozdzielczości URI, Wikipedia ma kilka fajnych przykładów.

aktualizacja

Tylko zauważa, że ​​Peter Perron skomentował redukcję odpowiedzi Shikhara, ale zostawię to tutaj, aby pokazać, jak to się robi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.