Open
Description
Here's the helper function I wrote:
from purl import URL
from urllib import parse
def resolve(base, url):
"""
Resolves a target URL relative to a base URL in a manner similar to that of a Web browser resolving an anchor tag HREF
:param base: str|URL
:param url: str|URL
:return: URL
"""
if isinstance(base, URL):
baseurl = base
else:
baseurl = URL(base)
if isinstance(url, URL):
relurl = url
else:
relurl = URL(url)
if relurl.host():
return relurl
if relurl.path():
return URL(
scheme=baseurl.scheme(),
host=baseurl.host(),
port=baseurl.port(),
path=parse.urljoin(baseurl.path(), relurl.path()),
query=relurl.query(),
fragment=relurl.fragment(),
)
elif relurl.query() or '?' in url:
return URL(
scheme=baseurl.scheme(),
host=baseurl.host(),
port=baseurl.port(),
path=baseurl.path(),
query=relurl.query(),
fragment=relurl.fragment(),
)
elif relurl.fragment() or '#' in url:
return URL(
scheme=baseurl.scheme(),
host=baseurl.host(),
port=baseurl.port(),
path=baseurl.path(),
query=baseurl.query(),
fragment=relurl.fragment(),
)
return baseurl
Usage:
>>> base = URL('http://user:[email protected]:8080/path/to/some/doc.html?q=query#frag')
...
>>> print(resolve(base, '../home'))
http://user:[email protected]:8080/path/to/home
>>> print(resolve(base, 'doc2.html'))
http://user:[email protected]:8080/path/to/some/doc2.html
>>> print(resolve(base, '?'))
http://user:[email protected]:8080/path/to/some/doc.html
>>> print(resolve(base, '?q=git'))
http://user:[email protected]:8080/path/to/some/doc.html?q=git
>>> print(resolve(base, '#'))
http://user:[email protected]:8080/path/to/some/doc.html?q=query
Metadata
Metadata
Assignees
Labels
No labels