Pergunta sobre python, python-3.x – Python: confusões com urljoin

42

Eu estou tentando formar URLs de diferentes partes e ter dificuldade em entender o comportamento desse método. Por exemplo:

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'

Você pode explicar o comportamento exato desse método?

Nota para aqueles que se deparam com esta questão: a declaração de importação acima é para o Python 3.x. Use "from urlparse import urljoin" para python 2.x. Joe J

Sua resposta

2   a resposta
0

urllib.parse.urljoin (base,url)

Se o URL for um URL absoluto (ou seja, começando com //, http: //, https: //, ...), o nome do host e / ou o esquema do URL estarão presentes no resultado. Por exemplo:

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

caso contrário, urllib.parse.urljoin(base, url)

Construa um URL completo ("absoluto") combinando um "URL base" (base) com outro URL (url). Informalmente, isso usa componentes da URL base, em particular o esquema de endereçamento, a localização da rede e (parte do) caminho, para fornecer componentes ausentes na 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'
>>>

ele pega o caminho do primeiro parâmetro (base), retira a parte após o último / e une-se ao segundo parâmetro (url).

Se url começar com /, ele se une ao esquema e netloc de base com url

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

A melhor maneira (para mim) de pensar nisso é o primeiro argumento,base é como a página em que você está no seu navegador. O segundo argumentourl é o href de uma âncora nessa página. O resultado é o URL final para o qual você será direcionado caso você clique.

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

Este faz sentido dar minha descrição. Embora se espere que a base inclua um esquema e domínio.

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

Se você está em um vhost algum, e há uma âncora como<a href='thing'>Foo</a> então o link irá levá-lo parahttp://some/thing

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

Estamos emsome/more aqui, então um link relativo dething nos levará a/some/thing

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

Aqui não estamossome/moreestamos emsome/more/ que é diferente. Agora, nosso link relativo nos levará asome/more/thing

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

E por fim. Se nosome/more/ e o href é/thing, você estará ligado asome/thing.

Obrigado por explicar ... esse tipo de comportamento procura "verdade"urljoin, agindo comoos.path.join EPo

Perguntas relacionadas