Skip to main content

urlkit

Working with URLs in Python sucks. Until now.

Previously, the way to work with URLs was with urllib. This was always difficult to remember, and very verbose. For example, let's take a URL and change one of the query parameters:

from urllib.parse import urlparse, parse_qs, urlencode, urlunparse

url_string = "http://example.com/?foo=bar&baz=qux"
# Parse the URL into components
parsed_url = urlparse(url_string)

# Parse the query string into a dictionary
query_params = parse_qs(parsed_url.query)

# Modify the specified query parameter
query_params[param] = [new_value]

# Reconstruct the query string
new_query = urlencode(query_params, doseq=True)

# Rebuild the URL with the updated query string
new_url = urlunparse((
    parsed_url.scheme,     # Scheme (e.g., http)
    parsed_url.netloc,     # Network location (e.g., example.com)
    parsed_url.path,       # Path (e.g., /)
    parsed_url.params,     # Parameters (if any)
    new_query,             # New query string
    parsed_url.fragment    # Fragment (if any)
))

Now with urlkit:

from urlkit.http_url import HttpUrl

url_string = "http://example.com/?foo=bar&baz=qux"
# Parse the URL
url = HttpUrl.parse(url_string)

# Set the parameter
url.query["foo"] = "Hello"

# Generate the new URL
new_url = str(url)

The goal for urlkit is for everything to be simpler and easier.

URL Type Support

The types in the table are intended to have eventual functionality. It shows which are currently supported.

Type Supported Notes
HTTP ✅ More or less complete support following RFC 1738 as far as possible.
HTTPS ✅ More or less complete support following RFC 1738 as far as possible.
FTP ❌
File ❌
Mailto ❌
Telnet ❌

Example Usage:

Constructing URLs

url = HttpUrl(scheme="http", host="example.com", port=12345, query={"search_text": "Hello World"})
str(url) # http://example.com:12345/?search_text=Hello%20World

url = HttpUrl(scheme="http", host="example.com", query={"search_text": "Hello World"}, query_options=QueryOptions(space_encoding=SpaceEncoding.PLUS))
str(url) # http://example.com:12345/?search_text=Hello+World

url = HttpUrl(scheme="http", host="example.com", query="some%20pre-encoded%20text")
str(url) # http://example.com/?some%20pre-encoded%20text

Parsing URLs

# Parsing a HTTP(s) URL:
http_url = HttpUrl.parse("http://username:password@example.com/search?description=Some%20Text")
http_url.path # /search
http_url.query # {"description": "Some Text"}
http_url.password # password

Modifying URLs

url = HttpUrl.parse("http://example.com/foo/bar") # http://example.com/foo/bar
url.path.append("baz") # http://example.com/foo/bar/baz
url.path.append("one/two") # http://example.com/foo/bar/baz/one/two
url.path.pop_last() # http://example.com/foo/bar/baz/one
url.path.pop_last() # http://example.com/foo/bar/baz
url.path.pop_last() # http://example.com/foo/bar
url.path.append(["baz", "one", "two"]) # http://example.com/foo/bar/baz/one/two

Explicitly Non-Supported Features

Multiple Query Parameters With Same Key

URLs are old. They have a lot of cruft, and it can make them difficult to work with. For example, many implementations, such as urllib, allow a query parameter to appear multiple times. So if you were to use the url http://example.com/?param=1&param=2 and then tried to get the result for param you would get a list back: ["1", "2"]. This can be nice. The downside though is that it means that every time you query for a parameter, even though they almost always appear just once, you get a list. i.e. https://example.com/?param=1 returns ["1"].

Release files for urlkit 0.2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for urlkit 0.2.2
File Size Uploaded
urlkit-0.2.2.tar.gz 10.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for urlkit 0.2.2
File Interpreter ABI Platform
urlkit-0.2.2-py3-none-any.whl Python 3 none any Details

Total release size: 22.0 kB

Release files / urlkit-0.2.2.tar.gz

Download URL urlkit-0.2.2.tar.gz
Size 10.8 kB
Tags Source
SHA-256 checksum
How to use checksums
30274c1b2e9b95edb0043dcb7ce4dec67c79ec9fb42c141ccfaa32717d304ed0
BLAKE2b-256 checksum
How to use checksums
48be5a62eca908a94e39033f414af73ae8267d5ca1b4da873adedca36604176f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.2 CPython/3.11.5 Darwin/23.6.0

Release files / urlkit-0.2.2-py3-none-any.whl

Download URL urlkit-0.2.2-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e101d74d07309f8948e10924cfaaf167129b362093a05422040ac6effe434229
BLAKE2b-256 checksum
How to use checksums
080df30fe98055edb1bc75d6058a8d8c94a80b80321730b6354e0e0784ff5976
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.2 CPython/3.11.5 Darwin/23.6.0

Release history Release notifications | RSS feed

This release

0.2.2 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page