45

What is the preferred solution for checking if an URL is relative or absolute?

4 Answers 4

73

Python 2

You can use the urlparse module to parse an URL and then you can check if it's relative or absolute by checking whether it has the host name set.

>>> import urlparse
>>> def is_absolute(url):
...     return bool(urlparse.urlparse(url).netloc)
... 
>>> is_absolute('http://www.example.com/some/path')
True
>>> is_absolute('//www.example.com/some/path')
True
>>> is_absolute('/some/path')
False

Python 3

urlparse has been moved to urllib.parse, so use the following:

from urllib.parse import urlparse

def is_absolute(url):
    return bool(urlparse(url).netloc)
Sign up to request clarification or add additional context in comments.

6 Comments

Shouldn't www.example.com/some/path count as abolute too?
Officially, that's an relative URL with the whole string as path. If you want it to count as absolute, you would have to either add the http:// by some pre-processing or not use urlparse.
According to RFC //google.com is a protocol-relative url. And your code will return False for it.
I'd prefer urlsplit instead of urlparse. BTW, in Django you have a Python 2 & 3 compatible way: from django.utils.six.moves.urllib.parse import urlsplit, urlparse
@Nik not for me: In [27]: urlparse('//google.com') Out[27]: ParseResult(scheme='', netloc='google.com', path='', params='', query='', fragment='')
|
32

If you want to know if an URL is absolute or relative in order to join it with a base URL, I usually do urllib.parse.urljoin anyway:

>>> from urllib.parse import urljoin
>>> urljoin('http://example.com/', 'http://example.com/picture.png')
'http://example.com/picture.png'
>>> urljoin('http://example1.com/', '/picture.png')
'http://example1.com/picture.png'
>>> 

2 Comments

It turns out that this is what I wanted to do - it treats the first URL as the default for all unspecified parts of the second URL. If the second one is absolute, it just uses that one.
Anyone using this should be aware that if given http://www.yahoo.com and www.google.com as inputs, this will give you http://www.yahoo.com/www.google.com as output, which probably isn't what you wanted. So you'll still have to check somehow if the second one is a url without a schema, or if actually a relative path.
3

Can't comment accepted answer, so write this comment as new answer: IMO checking scheme in accepted answer ( bool(urlparse.urlparse(url).scheme) ) is not really good idea because of http://example.com/file.jpg, https://example.com/file.jpg and //example.com/file.jpg are absolute urls but in last case we get scheme = ''

I use this code:

is_absolute = True if '//' in my_url else False

1 Comment

AFAIK //foo/bar is a valid relative URL. With "relative" meaning "without scheme and netloc".
-2
pip install yarl
import yarl

if not yarl.URL(image).is_absolute():
    image = context["request"].build_absolute_uri(image)

because

yarl.URL("//google.com").is_absolute() is True
True

in the opposite to

urllib.parse.urlsplit("//google.com").scheme == ""
True

netloc is still defined though

urllib.parse.urlsplit("//google.com").netloc == "google.com"

Pros.

  • easier to read
  • easier to test (you can mock one particular method)

Cons.

  • extra deps (but pretty stable one)

4 Comments

What is yarl? Please read How to Answer.
Python library. Well known
Don't assume that anything is "well known". The edited answer is better, but still not great: commands and code without any context rarely make a good answer. In this case you're asking folks to install some random package. What makes this better than the solution that uses the built-in urllib.parse.urljoin recommended in this answer? Again, please read How to Answer.
Using yarl is better because you move away from knowing the internal structure of the url. Easier to use and easier to test

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.