urllib.parse

Updated March 13, 2026 · Modules
stdlib url parsing web

The urllib.parse module is part of Python’s standard library and provides functions for parsing URLs into components and manipulating query strings. It handles the tricky parts of URL parsing so you don’t have to write your own parsing logic.

Syntax

from urllib import parse

Key Functions

urlparse() and urlsplit()

These functions parse a URL into its components.

from urllib.parse import urlparse, urlsplit

url = "https://example.com:8080/path/to/page?key=value#section"

result = urlparse(url)
print(result)
# ParseResult(scheme='https', netloc='example.com:8080', path='/path/to/page', params='', query='key=value', fragment='section')

print(result.scheme)   # https
print(result.netloc)   # example.com:8080
print(result.path)     # /path/to_page
print(result.query)    # key=value
print(result.fragment) # section

The urlsplit() function is similar but treats the path more consistently:

result = urlsplit("https://user:pass@example.com/path?query=1")
print(result)
# SplitResult(scheme='https', netloc='user:pass@example.com', path='/path', query='query=1', fragment='')

urlencode()

This function converts a dictionary or sequence of tuples into a URL-encoded query string.

from urllib.parse import urlencode

params = {"name": "Alice Smith", "age": 30, "city": "New York"}
encoded = urlencode(params)
print(encoded)
# name=Alice+Smith&age=30&city=New+York

# For more complex encoding, use quote
from urllib.parse import urlencode, quote_plus
encoded = urlencode(params, quote_via=quote_plus)
print(encoded)
# name=Alice+Smith&age=30&city=New+York

quote() and quote_plus()

These functions URL-encode a string, replacing special characters with %XX sequences.

from urllib.parse import quote, quote_plus

# Basic usage - encodes spaces and special chars
text = "Hello World! & Friends"
print(quote(text))
# Hello%20World%21%20%26%20Friends

# quote_plus replaces spaces with + (like form encoding)
print(quote_plus(text))
# Hello+World%21+%26+Friends

# Safe characters - specify chars to not encode
print(quote("/path/to file", safe="/"))
# /path/to%20file

unquote() and unquote_plus()

These functions decode URL-encoded strings.

from urllib.parse import unquote, unquote_plus

encoded = "Hello%20World%21%20%26%20Friends"
print(unquote(encoded))
# Hello World! & Friends

encoded_plus = "Hello+World%21+%26+Friends"
print(unquote_plus(encoded_plus))
# Hello World! & Friends

parse_qs() and parse_qsl()

These functions parse a query string into a dictionary or list of tuples.

from urllib.parse import parse_qs, parse_qsl

query = "name=Alice&age=30&city=New&city=York"

# parse_qs returns a dictionary with lists as values
result = parse_qs(query)
print(result)
# {'name': ['Alice'], 'age': ['30'], 'city': ['New', 'York']}

# parse_qsl returns a list of tuples, preserving order and duplicates
result = parse_qsl(query)
print(result)
# [('name', 'Alice'), ('age', '30'), ('city', 'New'), ('city', 'York')]

# Keep blank values
result = parse_qs("key=&other=value", keep_blank_values=True)
print(result)
# {'key': [''], 'other': ['value']}

Common Patterns

Building URLs

from urllib.parse import urljoin, urlunsplit

base = "https://example.com/path/"

# urljoin handles relative paths correctly
print(urljoin(base, "page.html"))
# https://example.com/path/page.html
print(urljoin(base, "../other/page.html"))
# https://example.com/other/page.html
print(urljoin(base, "/absolute/path"))
# https://example.com/absolute/path

# urlunsplit combines components into a full URL
url = urlunsplit(("https", "example.com:8080", "/path", "key=value", "section"))
print(url)
# https://example.com:8080/path?key=value#section

Parsing URLs from strings

from urllib.parse import urlparse

# Extract domain from URL
def get_domain(url):
    parsed = urlparse(url)
    return parsed.netloc

print(get_domain("https://api.example.com/v1/users"))
# api.example.com

# Check if URL is HTTPS
def is_secure(url):
    return urlparse(url).scheme == "https"

print(is_secure("https://example.com"))  # True
print(is_secure("http://example.com"))   # False

See Also