2012-06-05 8 views
32

Estoy tratando de formar URL de diferentes piezas, y tengo problemas para entender el comportamiento de este método. Por ejemplo:Python: confusiones con urljoin

3.x Python

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' 

Puede explicar el comportamiento exacto de este método?

+0

Nota para los que se encuentran con esta pregunta: la declaración de importación anterior es para Python 3.x. Utilice "from urlparse import urljoin" para python 2.x. –

Respuesta

51

La mejor manera (para mí) de pensar en esto es el primer argumento, base es como la página en la que se encuentra en su navegador. El segundo argumento url es el href de un ancla en esa página. El resultado es la url final a la que se le dirigirá si hace clic.

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

Esto tiene sentido dar mi descripción. Aunque uno esperaría que la base incluyera un esquema y dominio.

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

Si estás en un host virtual algunos, y no hay un ancla como <a href='thing'>Foo</a> entonces el vínculo le llevará a http://some/thing

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

Somos el some/more aquí, por lo que un enlace relativa de thing se llevarnos a /some/thing

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

Aquí, no estamos en some/more, estamos en some/more/ que es diferente. Ahora, nuestro vínculo relativo nos llevará a some/more/thing

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

Y, por último. Si está en some/more/ y el href está en /thing, se le vinculará al some/thing.

+0

Gracias por explicar ... este tipo de comportamiento hace que busque 'verdadero' 'urljoin', que actúa de forma similar a' os.path.join' –