🌐 URL parsing and manipulation made easy.

Overview

furl

furl is a small Python library that makes parsing and
manipulating URLs easy.

Python's standard urllib and urlparse modules provide a number of URL
related functions, but using these functions to perform common URL
operations proves tedious. Furl makes parsing and manipulating URLs
easy.

Furl is well tested, Unlicensed in the public domain, and supports
Python 2, Python 3, PyPy2, and PyPy3.

Code time: Paths and query arguments are easy. Really easy.

>>> from furl import furl
>>> f = furl('http://www.google.com/?one=1&two=2')
>>> f /= 'path'
>>> del f.args['one']
>>> f.args['three'] = '3'
>>> f.url
'http://www.google.com/path?two=2&three=3'

Or use furl's inline modification methods.

>>> furl('http://www.google.com/?one=1').add({'two':'2'}).url
'http://www.google.com/?one=1&two=2'

>>> furl('http://www.google.com/?one=1&two=2').set({'three':'3'}).url
'http://www.google.com/?three=3'

>>> furl('http://www.google.com/?one=1&two=2').remove(['one']).url
'http://www.google.com/?two=2'

Encoding is handled for you. Unicode, too.

>>> f = furl('http://www.google.com/')
>>> f.path = 'some encoding here'
>>> f.args['and some encoding'] = 'here, too'
>>> f.url
'http://www.google.com/some%20encoding%20here?and+some+encoding=here,+too'
>>> f.set(host=u'ドメイン.テスト', path=u'джк', query=u'☃=☺')
>>> f.url
'http://xn--eckwd4c7c.xn--zckzah/%D0%B4%D0%B6%D0%BA?%E2%98%83=%E2%98%BA'

Fragments also have a path and a query.

>>> f = furl('http://www.google.com/')
>>> f.fragment.path.segments = ['two', 'directories']
>>> f.fragment.args = {'one': 'argument'}
>>> f.url
'http://www.google.com/#two/directories?one=argument'

Or get fancy.

>>> f = furl('http://www.google.com/search?q=query#1')
>>> f.copy().remove(path=True).set(host='taco.com')
...  .join('/pumps.html').add(fragment_path='party').url
'http://taco.com/pumps.html#party'
>>>
>>> f.asdict()
{ 'url': 'http://taco.com/pumps.html#party',
  'scheme': 'http',
  'username': None,
  'password': None,
  'host': 'taco.com',
  'host_encoded': 'taco.com',
  'port': 80,
  'netloc': 'taco.com',
  'origin': 'http://taco.com',
  'path': { 'encoded': '/pumps.html',
            'isabsolute': True,
            'isdir': False,
            'isfile': True,
            'segments': ['pumps.html']},
  'query': { 'encoded': '',
             'params': []},
  'fragment': { 'encoded': 'party',
                'path': { 'encoded': 'party',
                          'isabsolute': False,
                          'isdir': False,
                          'isfile': True,
                          'segments': ['party']},
                'query': { 'encoded': '',
                           'params': []},
                'separator': True}, }

API

See more furl magic and examples in furl's API document, API.md.

Installation

Installing furl with pip is easy.

$ pip install furl
Comments
  • Should percent encode the query key and value when being encoded as str

    Should percent encode the query key and value when being encoded as str

    I use furl(v1.1) in http proxy app, and receive url in server side(the http proxy received from client):

    >>> url_received = 'http://example.com/?redirect=http%3A%2F%2Fwww.example.com%2F'
    >>> parsed = furl.furl(url_received)
    

    After do something with the parsed url, and generate url in client side(to be sent to the real server):

    >>> url_to_be_sent = parsed.url 
    >>> print(url_to_be_sent)
    'http://example.com/?redirect=http://www.example.com/'
    >>> print(url_to_be_sent.query)
    'redirect=http://www.example.com/'
    

    Should the "redirect=http://www.example.com/" part be percent encoded as original query "redirect=http%3A%2F%2Fwww.example.com%2F"?

    opened by xiren7 28
  • test_join test fails

    test_join test fails

    Hey folks. Thanks for your work on this project!

    I wanted to package furl for NixOS, and the build throws this error for me:

    .........................F..................................................
    ======================================================================
    FAIL: test_join (test_furl.TestFurl)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/build/furl-2.1.0/tests/test_furl.py", line 2042, in test_join
        assert f.url == 'wss://slrp.com/foo:1'
    AssertionError
    
    ----------------------------------------------------------------------
    Ran 76 tests in 9.423s
    

    It seems only this single test fails, all others are fine? That leads me to believe it's not a peculiarity of my packaging that's responsible.

    Anyways, for context here's the build nix expression I used:

    { lib, python3, radicale2 }:
    with python3.pkgs;
    
    buildPythonPackage rec {
        pname = "furl";
        version = "2.1.0";
    
        src = fetchPypi {
          inherit pname version;
          sha256 = "08dnw3bs1mk0f1ccn466a5a7fi1ivwrp0jspav9arqpf3wd27q60";
        };
    
        propagatedBuildInputs = [
          orderedmultidict six
        ];
    
        checkInputs = [
          flake8
        ];
    }
    
    opened by Valodim 17
  • we can't choose encoding of final url

    we can't choose encoding of final url

    this module is great and easy when manipulating urls

    adding "encoding" parameter to ".tostr" function would be nice rather than encoding everything in "utf8" since "utf8" is not only option in real life

    thanks

    opened by tuntapovski 10
  • Missing __hash__ method with Python 3.x

    Missing __hash__ method with Python 3.x

    Hi,

    I'm using your module directly and indirectly via the SQLAlchemy-Utils module and its URLType column type which coerces a URL into a furl object.

    I've found an issue when I try and use the URLType type on Python 3.x, I get the following error when I try and query an object using such a column:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/query.py", line 2588, in all
        return list(self)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 86, in instances
        util.raise_from_cause(err)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 189, in raise_from_cause
        reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 183, in reraise
        raise value
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 71, in instances
        rows = [proc(row) for row in fetch]
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 71, in <listcomp>
        rows = [proc(row) for row in fetch]
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 379, in _instance
        instance = session_identity_map.get(identitykey)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/identity.py", line 146, in get
        if key not in self._dict:
    TypeError: unhashable type: 'furl'
    

    I've managed to fix this by monkeypatching the furl class with a __hash__ method like so:

    from sqlalchemy_utils import URLType
    from furl import furl
    
    def furl_hash(self):
        return hash(self.url)
    
    furl.__hash__ = furl_hash
    
    class Foo(Model):
        url = Column(URLType)
        ...
    

    Would it be possible to add such a method? I'm not sure if I'm 100% correct just using the value of self.url here but it looked close enough.

    opened by bodgit 10
  • Add test for unicode keys and values

    Add test for unicode keys and values

    This implements the test from the comments of https://github.com/gruns/furl/issues/32 and demonstrates a regression (bug was reported in 0.3.mumble, fixed in 0.3.8, and is now broken in 0.4.1 and 0.4.2)

    opened by doismellburning 8
  • New bugs with Python 3.9.2+

    New bugs with Python 3.9.2+

    Python 3.9.1 #121

    ======================================================================
    FAIL: test_join (test_furl.TestFurl)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 2060, in test_join
        assert f.url == 'wss://slrp.com/foo:1'
    AssertionError
    

    Python 3.9.2

    ======================================================================
    FAIL: test_join (test_furl.TestFurl)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 2060, in test_join
        assert f.url == 'wss://slrp.com/foo:1'
    AssertionError
    
    ======================================================================
    FAIL: test_add (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 678, in test_add
        assert q.params.allitems() == runningsum
    AssertionError
    
    ======================================================================
    FAIL: test_params (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 806, in test_params
        assert item1 == item2
    AssertionError
    
    ======================================================================
    FAIL: test_remove (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 720, in test_remove
        assert len(q.params) == 0
    AssertionError
    
    ======================================================================
    FAIL: test_set (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 687, in test_set
        assert q.params.allitems() == items_omd.allitems()
    AssertionError
    
    ======================================================================
    FAIL: test_various (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 650, in test_various
        assert q.params.allitems() == items.allitems()
    AssertionError
    
    opened by shadchin 7
  • [Improvement] Fix code quality issues

    [Improvement] Fix code quality issues

    Description

    Hi :wave: I ran the DeepSource static analyzer on the forked copy of this repo and found some interesting code quality issues. This PR fixes a few of them.

    Summary of changes

    • fixed ambiguous variable names
    • Used literal syntax instead of function calls to create data structure
    • Refactored if expression
    • Refactored unnecessary else / elif when if block has a return statement
    • added .deepsource.toml config
    opened by withshubh 7
  • Why ``furl.set`` call ``self.query.load`` not ``self.query.set``?

    Why ``furl.set`` call ``self.query.load`` not ``self.query.set``?

    In [1]: furl('http://www.google.com/?one=1&two=2').set({'one': 'one'})
    Out[1]: furl('http://www.google.com/?one=one')
    
    In [2]: furl('http://www.google.com/?one=1&two=2').remove('one').add({'one': 'one'})
    Out[2]: furl('http://www.google.com/?two=2&one=one')
    

    How to realize In [2] more simply

    opened by Brightcells 7
  • 'Module_six_moves_urllib_parse' object has no attribute 'SplitResult'

    'Module_six_moves_urllib_parse' object has no attribute 'SplitResult'

    I do not get this error with furl-0.3.7. I get this error with furl-0.4.2.

    In [3]: furl.furl()
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-3-a2bd23daefba> in <module>()
    ----> 1 furl.furl()
    
    /Library/Python/2.7/site-packages/furl/furl.pyc in __init__(self, url, strict)
        847         self.strict = strict
        848 
    --> 849         self.load(url)  # Raises ValueError on invalid url.
        850 
        851     def load(self, url):
    
    /Library/Python/2.7/site-packages/furl/furl.pyc in load(self, url)
        865         # Python 2.7+. In Python <= 2.6, urlsplit() doesn't raise a
        866         # ValueError on malformed IPv6 addresses.
    --> 867         tokens = urlsplit(url)
        868 
        869         self.netloc = tokens.netloc  # Raises ValueError in Python 2.7+.
    
    /Library/Python/2.7/site-packages/furl/furl.pyc in urlsplit(url)
       1308         url = _set_scheme(url, 'http')
       1309     toks = urllib.parse.urlsplit(url)
    -> 1310     return urllib.parse.SplitResult(*_change_urltoks_scheme(toks, original_scheme))
       1311 
       1312 
    
    AttributeError: 'Module_six_moves_urllib_parse' object has no attribute 'SplitResult'
    
    opened by dydt 7
  • encode(dont_quote) & tostr(query_dont_quote) not implemented

    encode(dont_quote) & tostr(query_dont_quote) not implemented

    It appears that the 2 keyword arguments described in the API documentation aren't there yet:

    >>> furl.__version__
    '2.0.0'
    >>> f.query.encode(dont_quote='@')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: encode() got an unexpected keyword argument 'don't_quote'
    >>> f.tostr(query_dont_quote=True)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: tostr() got an unexpected keyword argument 'query_don't_quote'
    
    opened by eyeteajay 6
  • fix get scheme error

    fix get scheme error

    As Below

    In [1]: from furl import urlsplit
    
    In [2]: urlsplit('http://x.com/api/test?url=http://a.com')
    Out[2]: SplitResult(scheme='http', netloc='x.com', path='/api/test', query='url=http://a.com', fragment='')
    
    In [3]: urlsplit('/api/test?url=http://a.com')
    Out[3]: SplitResult(scheme='/api/test?url=http', netloc='a.com', path='', query='', fragment='')
    
    In [4]: from furl import furl
    
    In [5]: furl('http://x.com/api/test?url=http://a.com').query
    Out[5]: Query('url=http://a.com')
    
    In [6]: furl('/api/test?url=http://a.com').query
    Out[6]: Query('')
    

    About Scheme

    I not find any description about scheme's format, just a list of registered schemes.

    • http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml

    So I just add one line code to check whether ? in beforeColon to solve above problem.

    Preferred Solution

    What's your opinion?

    opened by Brightcells 6
  • Removes

    Removes "git@" from git remote URL

    Hi, ClearML uses furl to remove a user from a git remote URL, so furl removes username when the remote URL is like "ssh://[email protected]:1234/path/to/repo.git" (with "ssh://git@"):

    should I use more specific lib/tool to parse git-like URLs?

    opened by dev-rinchin 0
  • a method to set an individual query parameter without removing the rest or keeping the original value

    a method to set an individual query parameter without removing the rest or keeping the original value

    from furl import furl
    
    
    def url() -> furl:
        return furl("http://foo.com/?a=1&b=2")
    
    
    print(url().set({"a": 3}))  # http://foo.com/?a=3
    print(url().add({"a": 3}))  # http://foo.com/?a=1&b=2&a=3
    
    # i would like to be able do this in one method:
    print(url().remove(["a"]).add({"a": 3}))  # http://foo.com/?b=2&a=3
    

    the current behavior of add where it supports multiple query params with the same value seems like an edge case imo

    opened by DetachHead 0
  • Tolerate and correct IPv6 without brackets

    Tolerate and correct IPv6 without brackets

    This PR is based on #165 and fixes #124. If #124 is too controversial, I can rebase this PR on master, just tell me :)

    Depending on the contexts, people does not always agree on brackets usage with IPv6. For instance, the ipaddress core module handles IPv6 without brackets as do some other low-level python modules. Another example: DNS AAAA records usually handles IPv6 without brackets. However in a URL context, with a port number being optionally associated with an IP, the brackets become mandatory to distinguish the columns inside the IP from the column that separate the port number from the IP.

    As suggested in #124, I think this would be nice if a convenience utility like furl would tolerate and correct any usage. This would allow users to not need to check and correct manually the IPv6 they get from other libraries that may generate IPv6 without brackets because this is relevant in their development context. For instance a DNS SRV record being read with aiodns.

    This is what this PR allows. There is not much code here, everything lies here:

        def host(self, host):
            ...
            if (
                is_valid_ipv6(host)
                and callable_attr(host, 'startswith')
                and callable_attr(host, 'endswith')
                and not host.startswith("[")
                and not host.endswith("]")
            ):
                host = "[" + host + "]"
            ...
    

    This allows this usage:

            f.set(host="::1")
            assert f.host == "[::1]"
            assert f.url == "http://[::1]/"
    
            f.set(host="[::]")
            assert f.host == "[::]"
            assert f.url == "http://[::]/"
    
    opened by azmeuk 0
  • Use ipaddress to detect valid and invalid IPs

    Use ipaddress to detect valid and invalid IPs

    Fixes #164

    This leads to a breaking change: well-formed but invalid IPv6 such as [0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999] now raise a ValueError. However one can argue that this is not exactly a behavior change but more a bugfix.

    If you think the breaking change is too hash, I can do another PR that would raise a deprecation warning when a well-formed invalid IPv6 is encountered, to be merged and released before this PR is merged and released.

    What do you think?

    opened by azmeuk 0
  • Use the `ipaddress` module to detect valid IPV6

    Use the `ipaddress` module to detect valid IPV6

    I was surprised to see that furl would allow invalid but well-formed IPV6:

    https://github.com/gruns/furl/blob/774846234ff803606fdd289a7549f9b50b2b3677/tests/test_furl.py#L1658-L1661

    I would suggest to use the IPV6Address object from the python3 ipaddress module to validate IPV6. For python2 I would suggest using the ipaddress backport on pypi.

    If it is OK I would volunteer for a PR. What do you think?

    opened by azmeuk 0
Releases(v2.1.2)
  • v2.1.2(Apr 12, 2021)

    Fixed: Support Python 3.9's changed urllib.parse.urljoin() behavior.

    • < py3.9: furl('wss://slrp.com/').join('foo:1') -> 'wss://slrp.com/foo:1'
    • >= py3.9: furl('wss://slrp.com/').join('foo:1') -> 'foo:1'

    Changed: Drop semicolon query delimiters. See https://bugs.python.org/issue42967. Changed: Drop support for EOL Python 3.4 and Python 3.5.

    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Apr 9, 2021)

    Fixed: Export metadata variables (furl.__title__, furl.__version__, etc). Added: scheme, host, netloc, and origin as parameters to furl.remove(). Changed: Homogenize parameter order across furl.add(), furl.set(), and furl.remove(). Changed: furl.origin can be assigned None. This has the same behavior as furl.remove(origin=True).

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Sep 20, 2019)

    • Added: a dont_quote= parameter to Query.encode() and a query_dont_quote= parameter to furl.tostr() that exempt valid query characters from being percent-encoded, either in their entirety with dont_quote=True, or selectively with dont_quote=<string>, like dont_quote='/?@_'.

    • Changed: Move package info from __init__.py into the more standard __version__.py.

    • Fixed: Support Unicode usernames and passwords in Python 2.

    • Fixed: Update orderedmultdict to v1.0.1 to resolve a DeprecationWarning.

    • Fixed: Encode '/' consistently in query strings across both quote_plus=True and quote_plus=False.

    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Oct 16, 2018)

    • Added: All URL components (scheme, host, path, etc) to furl()'s constructor as keyword arguments. E.g. f = furl(scheme='http', host='host', path='/lolsup').

    • Changed: furl.truediv() and Path.truediv() now mirror Pathlib.truediv()'s behavior and return a new instance. The original instance is no longer modified. Old behavior: f = furl('1'); f / '2' -> str(f) == '1'. New behavior: f = furl('1'); f /= '2' -> str(f) == '1/2'.

    • Fixed: Path.load() now accepts Path instances, e.g. f.path.load(Path('hi')).

    • Removed: Support for Python 2.6, which reached EOL on 2013-10-29.

    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Aug 22, 2018)

  • v1.2(Jun 29, 2018)

    • Added: Path segment appending via the division operator (__truediv__()).
    • Changed: Bump orderedmultidict dependency to v1.0.
    • Changed: Check code style with flake8 instead of pycodestyle.
    • Changed: Percent-encode all non-unreserved characters in Query key=value pairs, including valid query characters (e.g. =, ?, etc). Old encoding: ?url=http://foo.com/; new encoding: ?url=http%3A%2F%2Ffoo.com%2F. Equal signs remain decoded in query values where the key is empty to allow for, and preserve, queries like ?==3==.
    Source code(tar.gz)
    Source code(zip)
  • v1.1(May 31, 2018)

    • Fixed: Support and preserve all query strings as provided. For example, preserve the query &&== of http://foo.com?&&== as-is. Empty key=value pairs are stored as ('', None) in Query.params, e.g. [('', None), ('', None)] for the query &.
    • Changed: Don't encode equal signs (=) in query values if the key is empty. That is, allow and preserve queries like ?==3== while also percent encoding equal signs in query values with an associted key, as expected. E.g. ?a=1%3D1.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(May 28, 2018)

    • Added: strip_scheme() public function.
    • Changed: Make get_scheme() and set_scheme() functions public.
    • Added: Support all schemes without a netloc/authority, like mailto:[email protected], without an explicit whitelist of such schemes (e.g. tel:, sms:, mailto:, etc).
    • Fixed: Restore furl.url's setter method. E.g. furl.url = 'http://www.foo.com/'.
    • Removed: Support for Python 3.3, which reached EOL on 2017-09-29.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Nov 20, 2017)

  • v1.0.0(Nov 20, 2017)

    • Added: Test against Python 3.6.
    • Changed: Bumped the version number to v1.0 to signify that furl is a mature and stable library. Furl has been marked Production/Stable in setup.py for a long time anyhow -- it's high time for the version number to catch up.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.7(Mar 1, 2017)

  • 0.5.6(Oct 23, 2016)

  • 0.5.3(Sep 23, 2016)

  • v0.5.2(Aug 14, 2016)

  • v0.5.1(Jun 29, 2016)

Owner
Ansgar Grunseid
Ansgar Grunseid
This is a no-bullshit file hosting and URL shortening service that also runs 0x0.st. Use with uWSGI.

This is a no-bullshit file hosting and URL shortening service that also runs 0x0.st. Use with uWSGI.

mia 1.6k Dec 31, 2022
A URL builder for genius :D

genius-url A URL builder for genius :D Usage from gurl import genius_url

ꌗᖘ꒒ꀤ꓄꒒ꀤꈤꍟ 12 Aug 14, 2021
hugeURLer 是一个基于 Python 和 GitHub action 的短链接服务

hugeURLer 是一个基于 Python 和 GitHub action 的短链接服务 如何使用 您需要把库 clone 到本地,然后在终端执行 python3 .\src\addNewRedirection.py url ,就能创建一个指向你设置的 url 的跳转页面。

安东尼洪 2 Dec 22, 2021
Shorten-Link - Make shorten URL with Cuttly API

Shorten-Link This Script make shorten URL with custom slashtag The script take f

Ahmed Hossam 3 Feb 13, 2022
A simple, immutable URL class with a clean API for interrogation and manipulation.

purl - A simple Python URL class A simple, immutable URL class with a clean API for interrogation and manipulation. Supports Pythons 2.7, 3.3, 3.4, 3.

David Winterbottom 286 Jan 02, 2023
encurtador de links feito com python

curt-link encurtador de links feito com python! instalação Linux: $ git clone https://github.com/bydeathlxncer/curt-link $ cd curt-link $ python3 url.

bydeathlxncer 5 Dec 29, 2021
A tool programmed to shorten links/mask links

A tool programmed to shorten links/mask links

Anontemitayo 6 Dec 02, 2022
Yet another URL library

Yet another URL library

aio-libs 884 Jan 03, 2023
URL Shortener in Flask - Web service using Flask framework for Shortener URLs

URL Shortener in Flask Web service using Flask framework for Shortener URLs Install Create Virtual env $ python3 -m venv env Install requirements.txt

Rafnix Guzman 1 Sep 21, 2021
Simple python library to deal with URI Templates.

uritemplate Documentation -- GitHub -- Travis-CI Simple python library to deal with URI Templates. The API looks like from uritemplate import URITempl

Hyper 210 Dec 19, 2022
Extract countries, regions and cities from a URL or text

This project is no longer being maintained and has been archived. Please check the Forks list for newer versions. Forks We are aware of two 3rd party

Ushahidi 216 Nov 18, 2022
A simple URL shortener built with Flask

A simple URL shortener built with Flask and MongoDB.

Mike Lowe 2 Feb 05, 2022
Python implementation for generating Tiny URL- and bit.ly-like URLs.

Short URL Generator Python implementation for generating Tiny URL- and bit.ly-like URLs. A bit-shuffling approach is used to avoid generating consecut

Alireza Savand 170 Dec 28, 2022
A python code for url redirect check

A python code for url redirect check

Fayas Noushad 1 Oct 24, 2021
:electric_plug: Generating short urls with python has never been easier

pyshorteners A simple URL shortening API wrapper Python library. Installing pip install pyshorteners Documentation https://pyshorteners.readthedocs.i

Ellison 350 Dec 24, 2022
🔗 Generate Phishing URLs 🔗

URLer 🔗 Generate Phishing URLs 🔗 URLer Table Of Contents General Information Preview Installation Disclaimer Credits Social Media Bug Report General

mrblackx 5 Feb 08, 2022
Have you ever wondered: Where does this link go? The REDLI Tool follows the path of the URL.

Have you ever wondered: Where does this link go? The REDLI Tool follows the path of the URL. It allows you to see the complete path a redirected URL goes through. It will show you the full redirectio

JAYAKUMAR 28 Sep 11, 2022
🌐 URL parsing and manipulation made easy.

furl is a small Python library that makes parsing and manipulating URLs easy. Python's standard urllib and urlparse modules provide a number of URL re

Ansgar Grunseid 2.4k Jan 04, 2023
A tool to manage the base URL of the Python package index.

chpip A tool to manage the base URL of the Python package index. Installation $ pip install chpip Usage Set pip index URL Set the base URL of the Pyth

Prodesire 4 Dec 20, 2022
A simple URL shortener app using Python AWS Chalice, AWS Lambda and AWS Dynamodb.

url-shortener-chalice A simple URL shortener app using AWS Chalice. Please make sure you configure your AWS credentials using AWS CLI before starting

Ranadeep Ghosh 2 Dec 09, 2022