webextractor: Scope, Fremdformate, Absturz bei PDF und zwei Virtualenvs #61

Open
opened 2026-10-16 11:08:11 +00:00 by alf · 0 comments
Owner

Problem

skills/webextractor/webextractor.py stammt aus den Anfangszeiten von Iris und hat beim Crawlen von https://google.github.io/comprehensive-rust/ (2026-10-16) mehrere Schwächen gezeigt. Aufruf war --strict --depth 6; der Lauf musste abgebrochen werden.

Beobachtet

  1. Standard-Scope ist der ganze Host. Ohne --strict folgt is_in_scope() jedem Link auf derselben Domain. Bei google.github.io wären das alle GitHub-Pages-Projekte von Google. --strict ist nicht Standard und in SKILL.md nicht erwähnt.
  2. --strict reicht bei Sprachversionen nicht. strict prüft nur das Pfadpräfix. Sprachversionen unter demselben Präfix (/comprehensive-rust/pt-BR/) werden trotzdem gecrawlt.
  3. Dubletten und Fremdformate. print.html (enthält jede Seite nochmal) und *.pdf werden abgerufen.
  4. Absturz bei Binärdaten. Ein PDF wird per BeautifulSoup(response.content, 'html.parser') als HTML geparst und wirft ValueError: invalid literal for int() ... aus handle_charref. Es gibt keine Prüfung auf Content-Type, und der Fehler wird nicht abgefangen. Der Lauf bricht ab.
  5. Rekursiver Tiefen-Crawl ohne Pause. scrape() ruft sich selbst auf (Tiefensuche), ohne Wartezeit zwischen Anfragen und ohne Obergrenze für die Seitenzahl.
  6. Zwei Virtualenvs. Im Skill-Ordner liegen venv/ und .venv/ nebeneinander; SKILL.md nennt .venv. Welches davon gilt, ist unklar.
  7. Quelle ignoriert. Für Projekte mit Markdown im Git-Repo ist ein Klon der Quellen sauberer als ein Crawl. Das hat der Skill nicht im Blick.

Was zu tun ist

  • --strict als Standard, Scope über Pfadpräfix.
  • Ausschlussliste per Option (--exclude), Standard: Sprachvarianten, print.html, *.pdf.
  • Nur text/html parsen (Content-Type prüfen), Parserfehler pro Seite abfangen und weitermachen.
  • Wartezeit zwischen Anfragen und --max-pages.
  • Iterativ statt rekursiv, mit einer Warteschlange.
  • Ein Virtualenv, SKILL.md und requirements.txt passend dazu.
  • SKILL.md kurz halten (Vertrag: Anweisung, keine Chronik), deterministische Teile im Skript.

Nachweis

Die Ausgabe des abgebrochenen Laufs ist nicht aufbewahrt. Reproduzierbar mit:

python3 webextractor.py https://google.github.io/comprehensive-rust/ --strict --depth 6 --output /tmp/cr

Der Kurs wurde stattdessen aus dem GitHub-Repo google/comprehensive-rust übernommen (Markdown-Quellen, Skript im Scratchpad der Session).

## Problem `skills/webextractor/webextractor.py` stammt aus den Anfangszeiten von Iris und hat beim Crawlen von `https://google.github.io/comprehensive-rust/` (2026-10-16) mehrere Schwächen gezeigt. Aufruf war `--strict --depth 6`; der Lauf musste abgebrochen werden. ## Beobachtet 1. **Standard-Scope ist der ganze Host.** Ohne `--strict` folgt `is_in_scope()` jedem Link auf derselben Domain. Bei `google.github.io` wären das alle GitHub-Pages-Projekte von Google. `--strict` ist nicht Standard und in `SKILL.md` nicht erwähnt. 2. **`--strict` reicht bei Sprachversionen nicht.** `strict` prüft nur das Pfadpräfix. Sprachversionen unter demselben Präfix (`/comprehensive-rust/pt-BR/`) werden trotzdem gecrawlt. 3. **Dubletten und Fremdformate.** `print.html` (enthält jede Seite nochmal) und `*.pdf` werden abgerufen. 4. **Absturz bei Binärdaten.** Ein PDF wird per `BeautifulSoup(response.content, 'html.parser')` als HTML geparst und wirft `ValueError: invalid literal for int() ...` aus `handle_charref`. Es gibt keine Prüfung auf `Content-Type`, und der Fehler wird nicht abgefangen. Der Lauf bricht ab. 5. **Rekursiver Tiefen-Crawl ohne Pause.** `scrape()` ruft sich selbst auf (Tiefensuche), ohne Wartezeit zwischen Anfragen und ohne Obergrenze für die Seitenzahl. 6. **Zwei Virtualenvs.** Im Skill-Ordner liegen `venv/` und `.venv/` nebeneinander; `SKILL.md` nennt `.venv`. Welches davon gilt, ist unklar. 7. **Quelle ignoriert.** Für Projekte mit Markdown im Git-Repo ist ein Klon der Quellen sauberer als ein Crawl. Das hat der Skill nicht im Blick. ## Was zu tun ist - `--strict` als Standard, Scope über Pfadpräfix. - Ausschlussliste per Option (`--exclude`), Standard: Sprachvarianten, `print.html`, `*.pdf`. - Nur `text/html` parsen (`Content-Type` prüfen), Parserfehler pro Seite abfangen und weitermachen. - Wartezeit zwischen Anfragen und `--max-pages`. - Iterativ statt rekursiv, mit einer Warteschlange. - Ein Virtualenv, `SKILL.md` und `requirements.txt` passend dazu. - `SKILL.md` kurz halten (Vertrag: Anweisung, keine Chronik), deterministische Teile im Skript. ## Nachweis Die Ausgabe des abgebrochenen Laufs ist nicht aufbewahrt. Reproduzierbar mit: ``` python3 webextractor.py https://google.github.io/comprehensive-rust/ --strict --depth 6 --output /tmp/cr ``` Der Kurs wurde stattdessen aus dem GitHub-Repo `google/comprehensive-rust` übernommen (Markdown-Quellen, Skript im Scratchpad der Session).
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
alf/2ndbrain#61
No description provided.