Вопрос по python – Python: путаница с urljoin

42

Я пытаюсь сформировать 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'

Можете ли вы объяснить точное поведение этого метода?

Примечание для тех, кто сталкивался с этим вопросом: приведенный выше оператор импорта предназначен для Python 3.x. Используйте & quot; из urlparse import urljoin & quot; для python 2.x. Joe J

Ваш Ответ

2   ответа
0

urllib.parse.urljoin(base, url)

If url is an absolute URL (that is, starting with //, http://, https://, ...), the url’s host name and/or scheme will be present in the result. For example:

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

в противном случае urllib.parse.urljoin(база, URL) будет

Construct a full (“absolute”) URL by combining a “base URL” (base) with another URL (url). Informally, this uses components of the base URL, in particular the addressing scheme, the network location and (part of) the path, to provide missing components in the relative URL.

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

он захватывает путь первого параметра (base), удаляет деталь после последнего / и присоединяется ко второму параметру (url).

Если url начинается с /, он соединяет схему и netloc базы с url

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

Лучший способ (для меня) подумать об этом - это первый аргумент,base это как страница, на которой вы находитесь в вашем браузере. Второй аргументurl является ссылкой якоря на этой странице. Результатом является окончательный URL-адрес, на который вы будете перенаправлены при нажатии.

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

Это имеет смысл дать мое описание. Хотя можно надеяться, что база включает в себя схему и домен.

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

Если вы на какой-то vhost, и есть такой якорь, как<a href='thing'>Foo</a> тогда ссылка приведет вас кhttp://some/thing

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

Мы наsome/more здесь, так что относительная связьthing приведет нас к/some/thing

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

Здесь мы неsome/more, мы наsome/more/ который отличается Теперь наша относительная ссылка приведет нас кsome/more/thing

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

И наконец. Если наsome/more/ и HREF должен/thing, вы будете связаны сsome/thing.

Error: User Rate Limit ExceededurljoinError: User Rate Limit Exceededos.path.join

Похожие вопросы