Pregunta sobre python-3.x, python – Python: confusiones con urljoin

42

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?

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

Tu respuesta

2   la respuesta
66

base es como la página en la que estás en tu navegador. El segundo argumentourl 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', 'thing')
'thing'

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

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

Si estás en una vhost alguna, y hay un ancla como<a href='thing'>Foo</a> entonces el enlace te llevará ahttp://some/thing

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

Estamos ensome/more Aquí, por lo que un enlace relativo dething nos llevará a/some/thing

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

Aquí no estamossome/moreestamos ensome/more/ Que es diferente. Ahora, nuestro enlace relativo nos llevará asome/more/thing

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

Y por último. Si ensome/more/ y el href es a/thingestarás vinculado asome/thing.

Gracias por explicar ... este tipo de comportamiento hace que parezca 'verdadero'urljoin, actuando similar aos.path.join EPo
0

url)

Si url es una URL absoluta (es decir, que comienza con //, http: //, https: //, ...), el nombre de host y / o el esquema de la url 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'

Preguntas relacionadas