Frage an python, python-3.x – Python: Verwechslungen mit urljoin

42

Ich versuche, URLs aus verschiedenen Teilen zu bilden, und habe Probleme, das Verhalten dieser Methode zu verstehen. Zum Beispiel:

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'

Können Sie das genaue Verhalten dieser Methode erklären?

Hinweis für diejenigen, die auf diese Frage stoßen: Die obige import-Anweisung gilt für Python 3.x. Verwenden Sie "from urlparse import urljoin" für Python 2.x. Joe J

Deine Antwort

2   die antwort
0

url)

Wenn url eine absolute URL ist (dh beginnend mit //, http: //, https: //, ...), sind der Hostname und / oder das Schema der URL im Ergebnis enthalten. Zum Beispiel:

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

ansonsten urllib.parse.urljoin(Basis, URL) wird

Erstellen Sie eine vollständige ("absolute") URL, indem Sie eine "Basis-URL" (base) mit einer anderen URL (url) kombinieren. Informell verwendet dies Komponenten der Basis-URL, insbesondere das Adressierungsschema, den Netzwerkstandort und (einen Teil) den Pfad, um fehlende Komponenten in der relativen URL bereitzustellen.

>>> 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'
>>>

Es erfasst den Pfad des ersten Parameters (Basis), entfernt das Teil nach dem letzten / und verbindet sich mit dem zweiten Parameter (URL).

Wenn url mit / beginnt, werden Schema und netloc von base mit url verbunden

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

darüber nachzudenken, ist das erste Argument.base ist wie die Seite, auf der Sie sich in Ihrem Browser befinden. Das zweite Argumenturl ist das href eines Ankers auf dieser Seite. Das Ergebnis ist die endgültige URL, zu der Sie weitergeleitet werden, wenn Sie auf klicken.

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

Dieser macht Sinn, meine Beschreibung zu geben. Obwohl man hoffen würde, dass die Basis ein Schema und eine Domäne enthält.

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

Wenn Sie auf einem vhost sind, und es gibt einen Anker wie<a href='thing'>Foo</a> dann führt Sie der Link zuhttp://some/thing

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

Wir sind dabeisome/more hier also ein relativer link vonthing bringt uns zu/some/thing

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

Hier sind wir nicht dransome/more, wir sind dabeisome/more/ das ist anders. Jetzt führt uns unser relativer Link zusome/more/thing

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

Und zuletzt. Wenn ansome/more/ und die href ist zu/thing, werden Sie verbunden mitsome/thing.

Vielen Dank für die Erklärung ... diese Art von Verhalten lässt nach "wahr" suchenurljoin, wirkt ähnlich wieos.path.join EPo

Verwandte Fragen