A Python 3.10+ tool/library to validate sitemap protocol compliance and check discovered URL reachability.
中文文档:README.zh-CN.md
- Async library API:
validate_target(...) - CLI command:
sitemap-verify check <target> - SQLite-backed runtime persistence for long-running validations
- Resume interrupted validations with
--resume-from <sqlite-file> - Supports sitemap inputs: XML
urlset,sitemapindex, text sitemap, RSS, Atom - Uses XSD validation (
xmlschema) plus protocol semantic validation - Recursively traverses sitemap indexes with depth/count safeguards
- URL reachability checks with SEO-oriented severity:
2xx=> pass3xx/429=>warn4xx/5xx/ network errors =>error
- Unified
error/warndiagnostics report with JSON output support - Search-engine-specific validation profiles for
googleandbing - Google media sitemap extension checks for image, video, and news namespaces
- Python 3.10+
uvfor environment and dependency management
uv sync --dev
uv run sitemap-verify check path/to/sitemap.xmlInstall from PyPI:
pip install sitemap-verifyValidate a remote sitemap URL:
uv run sitemap-verify check https://example.com/sitemap.xml --mode url --format jsonValidate against Google's sitemap rules and media extension requirements:
uv run sitemap-verify check https://example.com/sitemap.xml --mode url --engine googleValidate against Bing-specific sitemap guidance and best practices:
uv run sitemap-verify check https://example.com/sitemap.xml --mode url --engine bingValidate a domain (discover sitemap from robots.txt, fallback /sitemap.xml):
uv run sitemap-verify check example.com --mode domainEnable runtime logs, progress, and write output to a file:
uv run sitemap-verify check https://example.com/sitemap.xml \
--mode url \
--probe-method get \
--format json \
--output reports/result.json \
--log-file logs/run.log \
--verbose \
--show-progressPersist validation state to SQLite and resume after interruption:
uv run sitemap-verify check https://example.com/sitemap.xml \
--mode url \
--store reports/example-run.sqlite3
uv run sitemap-verify check https://example.com/sitemap.xml \
--mode url \
--resume-from reports/example-run.sqlite3If --store is not provided, the CLI creates a timestamped SQLite file under reports/.
During resume, sitemap files are parsed again, but URL reachability checks are skipped when a
cached result already exists in the SQLite store.
Reachability probe modes:
--probe-method get(default): always use GET (recommended for sites that block or mis-handle HEAD)--probe-method head: HEAD only--probe-method auto: HEAD first, fallback to GET when HEAD returns 4xx/5xx (except 429) or 405/501
--engine google: applies Google-specific sitemap guidance, including checks forimage,video, andnewssitemap extensions--engine bing: applies Bing-specific sitemap guidance, includinglastmodand IndexNow recommendations- Engine-specific findings are reported as
warnunless the sitemap structure is clearly invalid for the given Google extension - Google media support currently covers these namespaces:
http://www.google.com/schemas/sitemap-image/1.1http://www.google.com/schemas/sitemap-video/1.1http://www.google.com/schemas/sitemap-news/0.9
- Bing media-extension field rules are not enforced yet because the accessible official Bing documentation we found does not provide the same field-level schema guidance as Google
import asyncio
from sitemap_verify import validate_target
async def main() -> None:
report = await validate_target(
"https://example.com/sitemap.xml",
mode="url",
engine="google",
recursive=True,
check_reachability=True,
store_path="reports/example-run.sqlite3",
)
print(report.model_dump())
asyncio.run(main())Optional persistence arguments:
store_path: write validation state to a specific SQLite fileresume_from: reopen an interrupted SQLite file and reuse existing URL reachability results
When store_path is omitted, validate_target(...) creates a timestamped SQLite file under
reports/.
Run the test suite:
uv run pytestRun lint checks:
uv run ruff check .src/sitemap_verify/: application package and CLI entrypointsrc/sitemap_verify/schemas/: bundled XSD files used by the validatortests/: automated testsdocs/feat/: feature planning notesdocs/agent-lessons/: lessons from past fixed agent mistakes.github/: GitHub workflows and collaboration templates
- Bug reports and feature requests use issue templates under
.github/ISSUE_TEMPLATE/ - Pull requests follow
.github/pull_request_template.md - CI runs lint and tests on pushes and pull requests
- Update
project.versioninpyproject.toml - Commit the release changes to
main - Create and push a matching tag such as
v0.1.0 - GitHub Actions builds the package with
uv, runs tests, validates distributions, smoke-testspip install, and publishes via PyPI Trusted Publishing
Example:
git tag v0.1.0
git push origin v0.1.0This project is licensed under the MIT License. See LICENSE for details.