Python: confusiones con urljoin

Estoy tratando de formar direcciones URL a partir de diferentes partes y tengo problemas para entender el comportamiento de este método. Por ejemplo:

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' 

¿Puedes explicar el comportamiento exacto de este método?

La mejor manera (para mí) de pensar en esto es el primer argumento, la 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 será dirigido en caso de que haga clic.

 >>> urljoin('some', 'https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing') 'https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing' 

Este tiene sentido da mi descripción. Aunque uno esperaría que la base incluya un esquema y un dominio.

 >>> urljoin('http://some', 'https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing') 'http://some/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing' 

Si estás en una vhost, y hay un ancla como Foo , el enlace te llevará a http://some/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing

 >>> urljoin('http://some/more', 'https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing') 'http://some/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing' 

Estamos en some/more aquí, así que un enlace relativo de https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing nos llevará a /some/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing

 >>> urljoin('http://some/more/', 'https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing') # just a tad / after 'more' 'http://some/more/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing' 

Aquí, no estamos en some/more , estamos en some/more/ que es diferente. Ahora, nuestro enlace relativo nos llevará a some/more/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing

 >>> urljoin('http://some/more/', '/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing') 'http://some/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing' 

Y por último. Si en some/more/ y el href está en /https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing , estarás vinculado a some/https://stackoverflow.com/questions/10893374/python-confusions-with-urljoin/thing .

urllib.parse.urljoin (base, url )

Si url es una URL absoluta (es decir, que comienza con //, http: //, https: //, …), el nombre de host de la url y / o el esquema estarán presentes en el resultado. Por ejemplo:

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

De lo contrario, urllib.parse. urljoin (base, url) será

Construya una URL completa (“absoluta”) combinando una “URL base” (base) con otra URL (url). De manera informal, esto utiliza componentes de la URL base, en particular el esquema de direccionamiento, la ubicación de la red y (parte de) la ruta, para proporcionar componentes faltantes en la URL relativa.

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

toma la ruta del primer parámetro (base), elimina la parte después del último / y se une con el segundo parámetro (url).

Si url comienza con /, une el esquema y netloc de base con url

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