# Web Reading

> Router and protocol for reading and extracting web content. Decides first WHAT is needed (main text vs. structure vs. screenshot) and then WHICH tool available on the system delivers it. If nothing suitable is present, it recommends installing the web-scraper module.

- Skill: `ellmos-ai/web-reading` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add ellmos-ai/web-reading`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ellmos-ai/web-reading/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ellmos-ai (https://skillmd.com/u/ellmos-ai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ellmos-ai/web-reading

---

<img src="banner.png" width="100%" alt="web-reading banner">

# Webseiten lesen (Router)

## Zweck

Webinhalte abrufen und verarbeiten — aber nicht blind ein Werkzeug wählen.
Dieser Skill routet: **erst der Zweck, dann das beste verfügbare Werkzeug.**
Die eigentliche Implementierung lebt im **`web-scraper`-Modul**; dieser Skill
zeigt nur, was gerade da ist und wie man es nutzt.

## Schritt 1 — Was wird gebraucht?

```
Webseite verarbeiten?
  |
  +-- Haupttext (Artikel/Fließtext) → "Content"      → Schritt 2A
  +-- Links / Formulare / Headers   → "Struktur"     → Schritt 2B
  +-- Gerendertes Bild der Seite    → "Screenshot"   → Schritt 2C
```

## Schritt 2 — Welches Werkzeug? (Router)

Nimm das **erste verfügbare** Werkzeug in der jeweiligen Liste. „Verfügbar"
heißt: das Tool/der Skill/das Modul ist in dieser Session tatsächlich vorhanden.

### 2A — Content (Haupttext, sauberes Markdown)

| Priorität | Werkzeug | Verfügbar, wenn … | Nutzung |
|---|---|---|---|
| 1 | **`defuddle`**-Skill | Skill `defuddle` gelistet | sauberes Markdown aus normalen Webseiten |
| 2 | Built-in **`WebFetch`** | Agent hat das WebFetch-Tool | schnelles Lesen/Zusammenfassen einer URL |
| 3 | **`fc_web_fetch`** (MCP) | FileCommander-MCP geladen | `mode: "extract"` |
| 4 | **`web-scraper`**-Modul | Modul installiert/importierbar | `web-scraper extract <url>` bzw. `extract(url)` |

> Hinweis: `.md`-URLs sind bereits Markdown → direkt `WebFetch`, kein Extractor.

### 2B — Struktur (Links, Formulare, Headers)

Hier taugen `WebFetch`/`defuddle` **nicht** (sie liefern aufbereiteten Text,
keine rohe Struktur). Nimm daher:

| Priorität | Werkzeug | Verfügbar, wenn … | Nutzung |
|---|---|---|---|
| 1 | **`fc_web_fetch`** (MCP) | FileCommander-MCP geladen | `mode: "links" \| "forms" \| "headers"` |
| 2 | **`web-scraper`**-Modul | Modul installiert/importierbar | `web-scraper links\|forms\|headers <url>` |

### 2C — Screenshot

| Priorität | Werkzeug | Verfügbar, wenn … | Nutzung |
|---|---|---|---|
| 1 | **`web-scraper`**-Modul | Modul mit `[screenshot]`-Extra | `web-scraper screenshot <url> --out bild.png` |
| 2 | Browser-Automations-Tool | z. B. Playwright/Computer-Use vorhanden | seiten-abhängig |

## Schritt 3 — Fallback: nichts Passendes gefunden?

Wenn für den Zweck **kein** Werkzeug verfügbar ist, empfiehl die Installation
des **`web-scraper`-Moduls** (vollwertig: get/links/forms/headers/extract/screenshot):

```bash
# aus dem lokalen Modulordner (.MODULES/.TOOLS/web-scraper)
pip install ".[http,extract]"          # + [screenshot] für Screenshots

# danach:
web-scraper extract <url>
```

Als Bibliothek:

```python
from web_scraper import WebScraper, extract
print(extract("https://example.com")["content"])
```

## Notnagel — Standalone-Snippet (ohne alles)

Wenn wirklich nur die Standardbibliothek + `requests`/`bs4` da sind:

```python
import requests
from bs4 import BeautifulSoup

def extract_content(url: str) -> str:
    """Einfache Content-Extraktion."""
    response = requests.get(url, timeout=30)
    response.raise_for_status()
    soup = BeautifulSoup(response.text, "html.parser")
    for tag in soup(["script", "style", "nav", "header", "footer", "aside"]):
        tag.decompose()
    return soup.get_text(separator="\n", strip=True)
```

## Changelog

### 1.1.0 (2026-07-05)
- Umbau von reinem Protokoll zu **Router**: erkennt vorhandene Web-Fähigkeiten
  (`defuddle`, `WebFetch`, `fc_web_fetch`, `web-scraper`-Modul) und routet nach
  Zweck (Content/Struktur/Screenshot); empfiehlt sonst das `web-scraper`-Modul.
- Name auf `web-reading` vereinheitlicht (vorher DE `webseiten-lesen`).
- BACH-CLI-Beispiele aus dem Body entfernt (standalone-konform; Herkunft bleibt
  im `bach_integration`-Frontmatter dokumentiert).

### 1.0.0 (2026-03-12)
- Export aus BACH v3.8.0 Workflow `webseiten-lesen.md`

