{"id":2040,"library":"furl","title":"Furl","description":"Furl is a Python library designed for simple and powerful manipulation of URLs. It provides an object-oriented interface to parse, modify, and generate URLs, allowing easy access and modification of schemes, hosts, paths, query parameters, and fragments. The current version is 2.1.4, and it generally follows an as-needed release cadence for bug fixes and minor improvements, with major versions indicating significant API changes.","status":"active","version":"2.1.4","language":"en","source_language":"en","source_url":"https://github.com/gruns/furl","tags":["url","parsing","manipulation","networking"],"install":[{"cmd":"pip install furl","lang":"bash","label":"Install stable version"}],"dependencies":[{"reason":"Required for internal ordered dictionary-like structures for query parameters.","package":"orderedmultidict","optional":false}],"imports":[{"symbol":"furl","correct":"from furl import furl"}],"quickstart":{"code":"from furl import furl\n\n# Create a URL object\nf = furl(\"https://www.example.com/path/to/resource?param1=value1&param2=value2#fragment\")\nprint(f\"Original URL: {f.url}\")\n\n# Access components\nprint(f\"Scheme: {f.scheme}\")\nprint(f\"Host: {f.host}\")\nprint(f\"Path: {f.path}\")\nprint(f\"Query parameters: {f.query.params}\")\nprint(f\"Fragment: {f.fragment}\")\n\n# Modify components\nf.scheme = \"http\"\nf.host = \"api.example.org\"\nf.path /= \"v1\" # Append path segment\nf.query.add(\"apikey\", \"YOUR_API_KEY\") # Add a query parameter\nf.remove(fragment=True) # Remove fragment\n\nprint(f\"Modified URL: {f.url}\")\n\n# Join URLs\nbase = furl(\"http://base.com/foo\")\nrelative = furl(\"/bar?baz=qux\")\njoined = base.join(relative)\nprint(f\"Joined URL: {joined.url}\")","lang":"python","description":"This quickstart demonstrates how to create a `furl` object, access and modify its various components (scheme, host, path, query, fragment), and use methods like `join()` to combine URLs."},"warnings":[{"fix":"Upgrade your Python environment to 3.8 or newer, or pin furl to a version less than 2.1.4.","message":"As of v2.1.4, furl dropped support for all Python versions prior to Python 3.8, which are now long past EOL.","severity":"breaking","affected_versions":">=2.1.4"},{"fix":"Assign the result of the operation back to the variable (e.g., `f = f / 'segment'`) or use the in-place assignment operator (`f /= 'segment'`).","message":"The division operator (`/`) for `furl` and `Path` objects no longer modifies the instance in-place. It now returns a new instance, mirroring `Pathlib`'s behavior.","severity":"breaking","affected_versions":">=2.0.0"},{"fix":"Be aware of this behavior change when using `furl.join()` with scheme-like relative URLs on Python 3.9 and newer. Test your URL joining logic if it relies on specific edge cases.","message":"Due to changes in Python 3.9's `urllib.parse.urljoin()`, the `furl.join()` method's behavior for specific relative URLs (e.g., starting with a scheme-like string such as 'foo:1') will differ on Python 3.9+ compared to older Python versions. On Python < 3.9, `furl('wss://slrp.com/').join('foo:1')` returned `'wss://slrp.com/foo:1'`, but on Python >= 3.9, it returns `'foo:1'`.","severity":"gotcha","affected_versions":">=2.1.2"},{"fix":"Ensure your applications rely on ampersands (`&`) as the standard query delimiter. If consuming URLs with semicolon delimiters, consider pre-processing or adapting parsing logic to convert them to ampersands if needed.","message":"Support for semicolon (`;`) as a query delimiter has been dropped in alignment with `urllib.parse`'s behavior. URLs using semicolons as delimiters in their query string will now be parsed differently.","severity":"gotcha","affected_versions":">=2.1.2"}],"env_vars":null,"last_verified":"2026-04-09T00:00:00.000Z","next_check":"2026-07-08T00:00:00.000Z"}