Skip to content


Repository files navigation


PyPI version GitHub Black CodeCov Build

Dead links are an annoyance for websites with an extensive amount of content. A side from the negative impact on SEO, dead links are an annoyance for any user that clicks on one.

PyAnchor is primarily for checking the HTTP response on all links on a page. You can integrate it into your development workflow so that users never see a 404 in the first place.


PyAnchor requires Python 3.7 and above.

MacOS / Linux:

$ python3 -m pip install pyanchor


> python -m pip install pyanchor

Using the CLI

The CLI can be invoked with the pyanchor command. A URL must be provided unless it's the help page.

To get the help page:

> pyanchor --help

Example Gif

Basic example for a single page:

Note: all provided URLs must include a valid HTTP scheme.

> pyanchor

Example Gif

If you want to check all links on a website, and not just a single page, a sitemap.xml URL may be provided and flagged with --sitemap.


> pyanchor --sitemap

Example Gif

By default, successful requests are not printed to the terminal. To see all urls with a 200 response add the --verbose flag.

> pyanchor --verbose

Example Gif

> pyanchor --sitemap --verbose

Example Gif

But wait, there's more...

To integrate PyAnchor into your application, you can import the LinkResults class. LinkResults requires a URL.


>>> from pyanchor.link_checker import LinkResults
>>> r = LinkResults("")
>>> r.results
{200: ["", ""], 500: ["!/"]}

As you can see the results attribute is a dictionary containing all response codes returned as a dictionary key, with a list of URLs that achieve that response code as the dictionary value.

Analyzing Links

PyAnchor give you the ability to use the LinkAnalysis class to check the links in a given URL for unsafe and obsolete attributes.

To check for obsolete attributes use the obsolete_attrs property:

>>> from pyanchor.link_checker import LinkAnalysis
>>> r = LinkAnalysis("")
>>> r.obsolete_attrs
{'/about/link-1': ['charset', 'rev'], '/about/link-2': ['name']}

Likewise you can check for unsafe linkes with unsafe_attrs:

>>> from pyanchor.link_checker import LinkAnalysis
>>> r = LinkAnalysis("")
>>> r.unsafe_attrs
{<a href="/about/link-4" target="_blank">Link 4</a>: True, <a href="/about/link-5" rel="noreferrer noopener" target="_blank">Link 5</a>: False}

Any link that does not include rel="noopener" when the target attribute is used will return True. As in, it is True that this link is unsafe. Therfore, links with appropriate attributes will return False.


If you find a bug, please file an issue.

If you have feature requests, please file an issue and use the appropriate label.


If you would like to show your support for the project, I would be very grateful if you would donate to a charity close to my heart, Walk AS One.

And if you would prefer to donate to me personally instead, you can sponsor me on Github? 🤓

How to Contribute

Please raise an issue before making a PR, so that the issue and implementation can be discussed before you write any code. This will save you time, and increase the chances of your PR being merged without significant changes.

Please make PR's on a new branch, and not on main/master.

Please format you code with Black.

Please include tests for any PR's that include code (unless current tests cover your code contribution).


Thank you to: