2012-06-05 3 views
32

Ich versuche, URLs aus verschiedenen Teilen zu bilden, und habe Schwierigkeiten, das Verhalten dieser Methode zu verstehen. Zum Beispiel:Python: Verwirrungen mit URL

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?

+0

Hinweis für diejenigen, die über diese Frage kommen: Die obige Import-Anweisung ist für Python 3.x. Verwenden Sie "from urlparse import urljoin" für Python 2.x. –

Antwort

51

Der beste Weg (für mich), daran zu denken, ist das erste Argument, base ist wie die Seite, die Sie in Ihrem Browser sind. Das zweite Argument url ist die href eines Ankers auf dieser Seite. Das Ergebnis ist die letzte URL, auf die Sie weitergeleitet werden, wenn Sie auf klicken.

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

Dies ist sinnvoll, geben Sie meine Beschreibung. 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 einige sind, und es gibt ein Anker wie <a href='thing'>Foo</a> dann wird der Link gelangen Sie zu http://some/thing

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

Wir sind auf some/more hier, also eine relative Verknüpfung von thing wird nehmen uns /some/thing

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

Hier sind wir nicht auf some/more, sind wir auf some/more/ was anders ist. Nun, unser relativer Link führt uns zu some/more/thing

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

Und schließlich. Wenn auf some/more/ und die href ist /thing, werden Sie mit some/thing verknüpft werden.

+0

Danke für die Erklärung ... diese Art von Verhalten macht Suche nach 'wahr' 'urljoin' und wirkt ähnlich wie 'os.path.join' –