Skip to main content

PyStates

A lightweight, elegant Python CLI tool for fetching clean, distraction-free web articles.

Python License: MIT Trafilatura

---

📖 Description

PyStates is a fast, minimalist command-line utility that downloads full-length articles from major publications (The New Yorker, Wired, The Atlantic, and hundreds more) and extracts clean, readable text using the industry-leading Trafilatura library.

It automatically removes ads, navigation menus, sidebars, comments, and boilerplate, then saves the result as either beautifully formatted Markdown (.md) or clean Plain Text (.txt).

Designed for researchers, writers, journalists, students, and power users who want to archive high-quality content locally — without distractions or paywalls interfering with readability.

pystates -u https://www.newyorker.com/magazine/2025/01/20/the-new-ai-era

✨ Features

  • 🚀 Blazing Fast — Downloads and processes articles in under 3 seconds
  • 🛡️ 403 Bypass — Smart custom User-Agent headers to reliably avoid common blocks
  • 🧼 Pristine Extraction — Powered by Trafilatura for the cleanest possible text
  • 📝 Dual Format Support — Native .md (with headings, emphasis, and structure) or .txt
  • 🧹 Intelligent Filename Sanitization — Generates safe OS filenames from article titles without using re
  • ✍️ Custom Filenames — Override auto-generated names with the -o flag
  • 🐍 Modern Python Stack — Built for Python 3.10+ with clean architecture
  • 📦 One-Command Installation — pip install -e . for instant local development
  • 🌐 Broad Compatibility — Works with virtually any news, magazine, or blog site supported by Trafilatura

🚀 Installation (Local Dev Mode)

# 1. Clone the repository
git clone https://github.com/your-org/pystates.git
cd pystates

# 2. Install in editable/development mode
pip install -e .

Verify Installation

pystates --help

Requirements

  • Python ≥ 3.10
  • pip

All dependencies (requests, trafilatura, argparse) are automatically installed via pyproject.toml.

🖥️ Usage

Command Syntax

pystates -u URL [OPTIONS]

CLI Flags

Short Long Required Default Description
-u --url Yes — The full URL of the article to fetch and process
-f --format No md Output format. Accepted values: md or txt
-o --output No (auto) Custom output filename without extension. If omitted, a sanitized version of the article title is used

Examples

1. Basic usage (Markdown, auto-generated filename)

pystates -u "https://www.newyorker.com/magazine/2025/01/20/the-new-ai-era"

→ Creates the-new-ai-era.md

2. Save as plain text

pystates -u "https://www.wired.com/story/the-future-of-coding/" -f txt

→ Creates the-future-of-coding.txt

3. Custom output filename

pystates -u "https://www.theatlantic.com/ideas/archive/2025/07/climate-change/" \
         -o "climate_report_july_2025" \
         -f md

→ Creates climate_report_july_2025.md

4. Full-featured command

pystates \
  --url "https://www.newyorker.com/culture/cultural-comment/the-end-of-the-internet-as-we-know-it" \
  --format txt \
  --output "end_of_internet"

5. View all options

pystates --help

Sample Output (Markdown)

# The New AI Era

**By Jane Smith**  
*Published: January 20, 2025*  
*Source: The New Yorker*

---

Artificial intelligence is no longer a distant promise...

## A New Paradigm

The implications are profound...

📁 Project Structure

PyStates/
├── pystates/
│   ├── __init__.py          # Package metadata & version
│   ├── __main__.py          # Entry point for `python -m pystates`
│   ├── cli.py               # Argument parsing (argparse)
│   ├── exporters.py         # Filename sanitization + .md/.txt formatting
│   └── parser.py            # HTTP fetching (custom UA) + Trafilatura parsing
├── pyproject.toml           # Modern packaging + entry points
├── .gitignore
└── README.md

📜 License

This project is released under the MIT License.

See LICENSE for the full text.


PyStates — preserving the web's best writing, one clean file at a time.

Built with care by the open-source community.

Release files for pystates-CLI 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 pystates-CLI 0.1.0
File Size Uploaded
pystates_cli-0.1.0.tar.gz 5.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pystates-CLI 0.1.0
File Interpreter ABI Platform
pystates_cli-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 12.0 kB

Release files / pystates_cli-0.1.0.tar.gz

Download URL pystates_cli-0.1.0.tar.gz
Size 5.8 kB
Tags Source
SHA-256 checksum
How to use checksums
721c11c6eb78e8b4496f34f15a49ae5f7ba77f944ad7f3d9f72ca83b5b64c9c5
BLAKE2b-256 checksum
How to use checksums
96795f15cc5c6f955290d8ae585002ddee2cc35222ed267e61143589831c337a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

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

Download URL pystates_cli-0.1.0-py3-none-any.whl
Size 6.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
25f8622b3a972a77bfad7fdd8f2a0a10c291a2e43b1d6e266d6b0d5a7d3a6e1c
BLAKE2b-256 checksum
How to use checksums
f600281d944d86f1879a9fcd24f044ad705f9010d0973773bb10d817c1e5dec7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

0.1.0 This release

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