Pytanie w sprawie python, python-3.x – Python: zamieszanie z urljoin

42

Próbuję tworzyć adresy URL z różnych elementów i mieć problemy ze zrozumieniem zachowania tej metody. Na przykład:

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'

Czy możesz wyjaśnić dokładne zachowanie tej metody?

Uwaga dla tych, którzy natknęli się na to pytanie: powyższa instrukcja importowania dotyczy Pythona 3.x. Użyj „z urlparse import urljoin” dla python 2.x. Joe J

Twoja odpowiedź

2   odpowiedź
66

base jest jak strona, na której jesteś w swojej przeglądarce. Drugi argumenturl jest hrefem kotwicy na tej stronie. Rezultatem jest ostateczny adres URL, na który zostaniesz skierowany, jeśli klikniesz.

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

Ten ma sens podaj mój opis. Chociaż można mieć nadzieję, że baza zawiera schemat i domenę.

>>> urljoin('http://some', 'thing')
'http://some/thing'

Jeśli jesteś na widmie, a jest tam kotwica<a href='thing'>Foo</a> następnie link zabierze Cię dohttp://some/thing

>>> urljoin('http://some/more', 'thing')
'http://some/thing'

Jesteśmy nasome/more tutaj, więc względny linkthing zabierze nas do/some/thing

>>> urljoin('http://some/more/', 'thing') # just a tad / after 'more'
'http://some/more/thing'

Tutaj nie jesteśmysome/more, jesteśmy nasome/more/ co jest inne. Teraz nasz względny link zabierze nas dosome/more/thing

>>> urljoin('http://some/more/', '/thing')
'http://some/thing'

I wreszcie. Jeśli jest włączonysome/more/ a href ma/thing, zostaniesz połączony zsome/thing.

Dzięki za wyjaśnienie ... ten rodzaj zachowania sprawia, że ​​szukasz „prawdziwego”urljoin, działając podobnieos.path.join EPo
0

url)

Jeśli adres URL jest bezwzględnym adresem URL (tzn. Zaczynając od //, http: //, https: //, ...), nazwa hosta i / lub schemat adresu URL będą obecne w wyniku. Na przykład:

>>> urljoin('https://www.google.com', '//www.microsoft.com')
'https://www.microsoft.com'
>>>

w przeciwnym razie urllib.parse.urljoin(baza, url) będzie

Zbuduj pełny („absolutny”) adres URL, łącząc „podstawowy adres URL” (bazę) z innym adresem URL (url). Nieformalnie wykorzystuje to składniki podstawowego adresu URL, w szczególności schemat adresowania, lokalizację sieciową i (część) ścieżki, w celu dostarczenia brakujących komponentów w względnym adresie URL.

>>> urlparse('http://a/b/c/d/e')
ParseResult(scheme='http', netloc='a', path='/b/c/d/e', params='', query='', fragment='')
>>> urljoin('http://a/b/c/d/e', 'f')
>>>'http://a/b/c/d/f'
>>> urlparse('http://a/b/c/d/e/')
ParseResult(scheme='http', netloc='a', path='/b/c/d/e/', params='', query='', fragment='')
>>> urljoin('http://a/b/c/d/e/', 'f')
'http://a/b/c/d/e/f'
>>>

pobiera ścieżkę pierwszego parametru (bazy), usuwa część po ostatnim / i łączy się z drugim parametrem (url).

Jeśli url zaczyna się od /, dołącza schemat i netloc bazy z adresem URL

>>>urljoin('http://a/b/c/d/e', '/f')
'http://a/f'

Powiązane pytania