Skip to main content

dl-md

A command-line tool for downloading and converting website content from sitemaps to markdown format with organized directory structure.

Overview

dl-md extracts URLs from XML sitemaps and downloads each page as markdown, automatically organizing the content into a directory structure that mirrors the website's URL hierarchy.

Features

  • Sitemap Processing: Extracts URLs from XML sitemaps using trafilatura
  • Automatic Directory Structure: Creates directories based on URL paths
  • Markdown Conversion: Downloads and converts web pages to clean markdown format
  • Progress Reporting: Shows real-time progress as URLs are processed
  • Dry Run Mode: Preview what would be downloaded without actually fetching content
  • Verbose Output: Detailed logging for troubleshooting
  • Comprehensive Testing: Full test suite with 85% code coverage

Installation

Using Poetry (Recommended)

git clone https://github.com/donbowman/dl-md
cd dl-md
poetry install

Using pip

pip install dl-md

Usage

Basic Usage

dl <sitemap-url> [<sitemap-url> ...]

Example

Download all 'anyx-guide' and 'ufaq' post types from the Agilicus website:

dl https://www.agilicus.com/anyx-guide-sitemap.xml https://www.agilicus.com/ufaq-sitemap.xml

This command will:

  1. Fetch both sitemap files from www.agilicus.com
  2. Extract all URLs from both sitemaps
  3. Create a directory structure like:
    agilicus.com/
    ├── anyx-guide/
    │   ├── getting-started.md
    │   ├── installation.md
    │   └── configuration.md
    └── ufaq/
        ├── troubleshooting.md
        ├── common-issues.md
        └── support.md
    
  4. Download each URL and convert it to clean markdown format

Command Options

  • -v, --verbose: Enable detailed output showing progress and debugging information
  • -o, --output-dir TEXT: Specify output directory (default: current directory)
  • --dry-run: Show what would be downloaded without actually fetching content
  • --help: Show help message and exit

Examples

Verbose output with custom directory:

dl --verbose --output-dir ./downloads https://example.com/sitemap.xml

Dry run to preview structure:

dl --dry-run https://example.com/sitemap.xml

Multiple sitemaps:

dl https://site1.com/sitemap.xml https://site2.com/sitemap.xml

Directory Structure

The tool creates directories based on URL structure:

URL Directory Filename
https://www.example.com/blog/post1 example.com/blog/ post1.md
https://example.com/docs/guide example.com/docs/ guide.md
https://example.com/ example.com/ index.md

How It Works

  1. Sitemap Parsing: Uses trafilatura's sitemap_search() to extract URLs from XML sitemaps
  2. URL Processing: Parses each URL to determine directory structure and filename
  3. Content Fetching: Downloads each page using trafilatura's fetch_url()
  4. Markdown Conversion: Converts HTML content to clean markdown using trafilatura's extract()
  5. File Organization: Saves markdown files in organized directory structure

Development

Running Tests

poetry run pytest

Running Tests with Coverage

poetry run pytest --cov=dl_md --cov-report=term-missing

Project Structure

dl-md/
├── dl_md/
│   ├── __init__.py
│   └── cli.py          # Main CLI implementation
├── tests/
│   ├── __init__.py
│   └── test_cli.py     # Comprehensive test suite
├── pyproject.toml      # Project configuration
├── poetry.lock         # Dependency lock file
└── README.md           # This file

Dependencies

  • click: Command-line interface framework
  • trafilatura: Web scraping and content extraction
  • requests: HTTP library for web requests
  • pytest: Testing framework (development)
  • pytest-cov: Coverage reporting (development)

Error Handling

The tool gracefully handles various error conditions:

  • Network errors: Continues processing other URLs if one fails
  • Invalid sitemaps: Reports errors and continues with other sitemaps
  • Content extraction failures: Logs failures and continues processing
  • File system errors: Reports permission or disk space issues

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Run the test suite: poetry run pytest
  6. Submit a pull request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For issues and questions:

  • Check the verbose output with -v flag for debugging information
  • Review the test suite for usage examples
  • Open an issue on the project repository

Metadata

Release files for dl-md 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dl-md 0.1.0
File Size Uploaded
dl_md-0.1.0.tar.gz 5.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dl-md 0.1.0
File Interpreter ABI Platform
dl_md-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 11.4 kB

Release files / dl_md-0.1.0.tar.gz

Download URL dl_md-0.1.0.tar.gz
Size 5.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9e7ad052411aba12816b96c0956fd67d856397b049617c214b04415d85a09315
BLAKE2b-256 checksum
How to use checksums
aa8c8201c48ecf75f41579e29df4ece2ff9eb94f32d579224a30ea115365f8e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 24, 2025.

Transparency log

Release files / dl_md-0.1.0-py3-none-any.whl

Download URL dl_md-0.1.0-py3-none-any.whl
Size 6.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f2c258536e69362f539c258d44f273f36f6f2ad94c2e249e32e0bb2df1154f3b
BLAKE2b-256 checksum
How to use checksums
70f468b4a67d26ad3cf0094387a50161cdfa050f0c8a5612e53ca6f4542f2544
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 24, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page