Lee Foot

Categories Missing From Navigation

Find sitemap URLs not linked from your site navigation element.

View the source

#about

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 URLCSS 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.
Category
E-commerce

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

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

#faq

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.

/contact

Want me to run this for you? I run this tool as a managed service, or build something custom around your data. You get the insights without touching the code.