Back to Tools

Categories Missing From Navigation

Use cases

Finding category pages orphaned from the main navigation Auditing navigation coverage after a menu redesign Identifying sections of large e-commerce sites with no nav links

Fetches all URLs from an XML sitemap (sitemap index files supported with polite 2-second delays between child fetches), then fetches a page and extracts every link inside a user-supplied CSS selector for the navigation element using BeautifulSoup.

Reports sitemap URLs missing from the navigation set.

Comparison is exact (case-sensitive, trailing-slash sensitive).

JavaScript-rendered navigation is not supported.

Platform

Python script (requires Python 3.x)

Input

XML sitemap URL

CSS selector for the navigation element (e.g. nav, #main-nav, .header-menu)

Optional: page URL to check (defaults to homepage derived from sitemap domain)

Output

CSV listing every sitemap URL not found as a link inside the navigation element on the checked page.

View Source

Features

  • Sitemap index support with 2-second polite delay between child fetches
  • User-configurable CSS selector for the navigation element (default: nav)
  • Optional URL-contains filter to limit results (e.g. /category/)
  • Relative link resolution to absolute URLs via urljoin
  • Real browser user agent sent with all requests
  • 30-second request timeout per fetch

How to use

  1. 1 Enter your XML sitemap URL
  2. 2 Set the CSS selector for your navigation element in the sidebar
  3. 3 Optionally enter a URL-contains filter (e.g. /category/)
  4. 4 Optionally override the page to check (defaults to homepage)
  5. 5 Click Find Missing URLs
  6. 6 Download the missing URLs CSV

Frequently asked questions

Does it work with JavaScript-rendered navigation?
No. It fetches raw HTML with requests and parses it with BeautifulSoup. Navigation injected by JavaScript after page load will not be visible. You would need to export a rendered version of the page separately.
How does it handle sitemap index files?
If the sitemap URL points to a sitemap index (contains a sitemapindex element), it fetches each child sitemap in turn with a 2-second delay between requests. All loc URLs from all child sitemaps are combined into a single list for comparison.
Is the URL comparison case-sensitive?
Yes. The comparison is an exact set difference with no normalisation. If your sitemap uses https://www.example.com/Category/ but the navigation links to https://www.example.com/category/, it will be reported as missing. Ensure both use consistent URL formats.
What does the URL-contains filter do?
It restricts the missing URLs report to only those containing a specific substring, for example /category/ or /collections/. This is useful when your sitemap includes product pages and blog posts but you only care about category-level navigation coverage.
Which page does it check for navigation links?
By default it derives the homepage from the sitemap URL (scheme + netloc + /). You can override this with any page URL, for example a category landing page, if your navigation varies across templates.

Need something built for your business?

This tool started as bespoke client work. I build custom scripts, data pipelines, and full apps for SEO and product data problems that off-the-shelf tools don't solve.

Tell Me What You Need