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¶m=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"].
Metadata
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)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| urlkit-0.2.2.tar.gz | 10.8 kB | Without provenance | Details for urlkit-0.2.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| urlkit-0.2.2-py3-none-any.whl | Python 3 | none | any | Details for urlkit-0.2.2-py3-none-any.whl |
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
|
Security for urlkit 0.2.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.