← Zurück zum Blog
pullmdweb-scrapingclaude-codeextraction19. April 2026 · 8 Min. Lesezeit

PullMD Teil 3: Mehr als Reddit, mehr als Readability – Einfach erklärt

URL → ROUTING GATE → EXTRACTION PATHS
Editorial-Diagramm: URL-Input speist eine zentrale Routing-Gate, die in vier Extraction-Path-Cards verzweigt (Cloudflare MD, Reddit JSON, Readability, Trafilatura); rechts der Quality-Score; unten links ein kleines Log-Panel mit Health-, Signal- und Routed-Status.Editorial-Diagramm: URL-Input speist eine zentrale Routing-Gate, die in vier Extraction-Path-Cards verzweigt (Cloudflare MD, Reddit JSON, Readability, Trafilatura); rechts der Quality-Score; unten links ein kleines Log-Panel mit Health-, Signal- und Routed-Status.

Das hier ist eine Geschichte in drei Akten. Erst sprengt eine spontane Tippfehler-Frage die Grenzen eines Werkzeugs, das ich für genau einen Zweck gebaut hatte. Dann wächst es in kleinen Schritten weiter. Und am Ende finde ich einen Fehler, der wochenlang still unter allem lief — ohne dass jemand etwas davon merkte.

Wer Teil 2 gelesen hat, weiß: drei Wochen lief mein Markdown-Service still vor sich hin. Nur für Reddit-Posts. Nur auf meinem Handy. Nur für mich.

Erst mal: was ist hier los?

Das Tool nimmt eine Internet-Adresse — also einen Link, zum Beispiel zu einem Blog-Artikel — und gibt mir den Text dieses Artikels in einem ganz einfachen Format zurück. Das Format heißt Markdown und ist nur Text mit ein paar Sternchen für Überschriften und Listen, ohne den ganzen Drumherum-Müll wie Werbung, Menüs oder Cookie-Banner.

Warum will ich das? Weil ich diesen sauberen Text dann in einen Chat mit der KI packe und über den Inhalt reden kann.

Akt 1: Der Pivot — als das Tool plötzlich mehr können musste

Am Vormittag des 20. März wollte ich aus Versehen einen ganz normalen Artikel einlesen — also einen Link, der gar nichts mit Reddit zu tun hatte. Was zurückkam, war nichts. Leeres Ergebnis.

Verständlich. Ich hatte den Service ja nur für Reddit gebaut. Für alles andere gab es schlicht keinen Weg.

Also tippte ich in den Chat mit Claude hinein:

„die URL soll auch bei normalen seiten im markdown erscheinen… das war doch bisher nicht so oder?“

Die Antwort war klar: Nein, ging bisher nicht. Mein Tool saß in einem Käfig, den ich selbst gebaut hatte. Reddit zuerst, hatte ich gesagt. Aber jetzt brauchte ich: jede Webseite. Nicht nur eine.

Drei Wege statt einem

Die Lösung waren drei verschiedene Pfade — je nachdem, was für eine Webseite reinkommt:

Pfad eins: Mozilla Readability. Das ist eine fertige Bibliothek, die Mozilla für den Firefox-Lesemodus entwickelt hat — also genau das Ding, das Artikel-Text aus einer Webseite herausholt und alles drumherum wegwirft. Eine Art „Reinheits-Filter“ für Webseiten. Dazu ein zweites kleines Werkzeug namens Turndown, das den gefilterten Text dann ins Markdown-Format umbaut.

Pfad zwei: Cloudflare. Cloudflare ist eine Firma, durch deren Server viele Webseiten laufen. Für manche Seiten bietet Cloudflare schon fertig sauberen Text an — ohne dass ich selbst irgendwas filtern muss. Wenn das verfügbar ist, nehme ich das. Schneller, zuverlässiger.

Pfad drei: Der bisherige Reddit-Pfad bleibt unverändert für Reddit-Links.

Drei Wege, wo vorher einer war. Der Käfig war offen.

Akt 2: Die Reifephase — kleine Verbesserungen im April

Im April fing ich an, mir Notizen zu machen — kein richtiges Konzept, eher eine Sammlung von Fragen, die mir beim Benutzen auffielen. Die Hauptfrage war: Was fehlt eigentlich, wenn nicht ich den Text lese, sondern eine KI ihn weiterverarbeiten soll?

Ein Mensch füllt Lücken im Kopf automatisch. Eine KI nicht. Sie braucht Struktur.

Daraus wurden drei kleine Verbesserungen.

Tabellen, die als Tabellen ankommen

Das alte Umbau-Werkzeug Turndown konnte mit Tabellen nichts anfangen. Hatte eine Webseite eine Tabelle, kam beim Umbau nur Chaos heraus — die Zeilen und Spalten waren weggebügelt.

Auch Code-Blöcke — also kleine Programm-Schnipsel — kamen ohne Sprach-Etikett an. Das ist ungefähr so, als bekäme man ein Zitat aus einem Buch, ohne den Hinweis, in welcher Sprache es war.

Das Umbau-Werkzeug haben wir ausgetauscht. Das neue versteht Tabellen, behält Sprach-Etiketten bei Code, und unterstützt sogar Häkchen-Listen. Ein Zeilen-Tausch in der Verarbeitung — aber sofort viel bessere Ergebnisse.

Zusatz-Informationen mitliefern

Bis dahin lieferte mein Tool nur den nackten Text. Kein Titel, kein Autor, kein Datum. Das ist okay, wenn ich selber lese. Aber wenn eine KI mit dem Text weiterarbeiten soll, fehlt ihr der Kontext.

Also bauten wir einen kleinen Helfer ein, der diese Zusatz-Informationen aus jeder Webseite herausholt: Titel, Beschreibung, Autor, Veröffentlichungsdatum. Diese Infos kommen jetzt als kurzer Block am Anfang jedes Texts mit.

Notfall-Plan, wenn der Reinheits-Filter versagt

Readability — der Reinheits-Filter — funktioniert nicht überall. Bei Bezahlschranken, bei Seiten die nur mit JavaScript laufen, bei seltsam gebauten Seiten — da kommt manchmal nur ein winziger Text-Schnipsel heraus. Sichtbar zu wenig.

Statt in solchen Fällen aufzugeben, gibt es jetzt einen Notfall-Plan: nehme einfach den gesamten Seiten-Inhalt, putze ihn nur grob durch, und liefere das. Im Zusatz-Info-Block steht dann „Notfall-Pfad“, damit ich später sehen kann, wie oft das passiert ist.

Bis hierher war alles in kleinen Schritten. Dann kam der 25. April.

Akt 3: Der Fehler, der wochenlang lebte

Eigentlich wollte ich nur eine einfache Frage beantworten: Ist Readability wirklich der beste Reinheits-Filter? Oder gibt es einen besseren?

Also habe ich einen Vergleich aufgesetzt. 15 echte Webseiten, drei verschiedene Filter, alles parallel laufen lassen. Einer der Filter war Trafilatura — eine Bibliothek aus der Python-Welt, die ursprünglich für Web-Archive entwickelt wurde und besonders gut darin ist, auch aus schwierigen Seiten noch ordentlich Text herauszuholen.

Beim Auswerten der Ergebnisse fiel mir etwas Komisches auf. Die Ergebnisse von Readability sahen anders aus, als ich erwartet hatte. Kürzer, rauer, irgendwie ungelenker. Nicht das, was ich vom Firefox-Lesemodus kannte.

Ich grub mich in den Code und folgte dem Pfad zurück, den jede Anfrage nimmt. Was ich fand, war unangenehm.

Der eingebaute Schalter, der falsch stand

Beim Reddit-Pfad braucht man die Kommentare unter einem Post. Also gab es einen Schalter: „Kommentare mitnehmen — ja oder nein?“. Für Reddit stand er auf „ja”.

Aber: dieser Schalter stand standardmäßig auf „ja“ — für alle Anfragen. Auch für ganz normale Webseiten. Und wenn er auf „ja“ stand, übersprang das Tool den Reinheits-Filter komplett und nahm stattdessen einen einfacheren Weg — den gesamten Seiten-Inhalt nur grob geputzt.

Das hieß: wochenlang lief mein Tool für ganz normale Webseiten überhaupt nicht durch Readability. Was ich die ganze Zeit für „Readability-Ergebnisse“ gehalten hatte, war eigentlich nur grob geputzter Roh-Inhalt.

Mein Vergleich hatte wochenlang die falsche Sache gegen Trafilatura gemessen.

Der Fix war eine einzige Zeile Code: bei normalen Webseiten den Schalter auf „nein“ stellen.

Was der ehrliche Vergleich zeigte

Nach dem Fix machte der Vergleich endlich Sinn. Und plötzlich war klar:

Auf einer kleinen persönlichen Blog-Seite holte Readability gerade mal etwa 100 Zeichen Text heraus. Trafilatura holte fast 15.000 Zeichen aus derselben Seite. Das ist mehr als hundertmal so viel.

Bei einer Tech-News-Seite: etwa 470 Zeichen mit Readability, etwa 1.700 mit Trafilatura. Bei einem anderen Blog: 80 Prozent mehr Inhalt durch Trafilatura.

Aber: bei Seiten mit Tabellen — Wikipedia zum Beispiel, oder Programmier-Dokumentation — war Readability besser. Es hielt die Struktur sauberer.

Also keine Entweder-Oder-Entscheidung. Beide Filter laufen jetzt parallel. Eine einfache Bewertung entscheidet pro Anfrage, welches Ergebnis besser aussieht — und das wird ausgeliefert.

Wie das Tool entscheidet, was „besser“ ist

Die Bewertung ist absichtlich simpel — fünf Faustregeln:

  • Ist der Text länger als 500 Zeichen? Punkt.
  • Ist das Verhältnis von extrahiertem Text zur Original-Seiten-Größe über zwei Prozent? Punkt.
  • Hat die Original-Seite überhaupt einen Artikel-Bereich? Punkt.
  • Ist mindestens eine Überschrift drin? Punkt.
  • Sind mindestens drei richtige Absätze drin? Punkt.

Wer die meisten Punkte sammelt, gewinnt. Reddit-Posts und Cloudflare-Texte bekommen Bonus-Punkte, weil sie schon „sauber von der Quelle her“ sind.

Der Punktestand landet in einem versteckten Etikett bei jeder Antwort, damit ich später nachsehen kann, wie zuverlässig das Tool für eine bestimmte Webseite war.

Was sagt es, wenn man wochenlang einen Fehler übersieht?

Das ist die unangenehme Frage am Ende dieser Geschichte.

Der Output war „gut genug“. Grob geputzter Roh-Inhalt enthält für viele Seiten den meisten relevanten Text — auch ohne Reinheits-Filter. Wenn der Unterschied zwischen „richtig“ und „falsch“ schwer zu sehen ist, sieht man ihn eben nicht. Nicht weil man unaufmerksam ist — sondern weil es kein sichtbares Signal gibt.

Daraus zog ich eine Konsequenz: eine kleine Datenbank, die für jede Anfrage mitschreibt, welcher Pfad genommen wurde, wie viele Punkte das Ergebnis bekam, wie lange es gedauert hat. Nach 30 Tagen werden die Einträge automatisch gelöscht.

Dazu ein winziger Abfrage-Punkt: „Zeig mir die letzten sieben Tage“. Daraus sehe ich dann: wie viele Anfragen liefen durch welchen Filter? Welche Seiten haben durchschnittlich schlechte Punktestände? Verschiebt sich gerade irgendetwas?

Wenn das nächste Mal eine Einstellung still und heimlich den falschen Pfad wählt, sehe ich es in der Statistik. Es ist keine Garantie. Aber es ist ein Signal.

Die Lehre

Für jedes selbst-gebaute Tool gilt: entweder du baust dir einen Blick in die Maschine ein — oder du fliegst blind.

Der Blick muss nicht groß sein. Eine kleine Tabelle und ein einfacher Abfrage-Punkt reichen als erster Schritt. Aber ohne irgendetwas davon kann ein Tool wochenlang die falsche Antwort geben — und niemand merkt es.

Was als nächstes kam

Drei Pfade, ein Bewertungs-System, eine Schnittstelle für KI-Helfer und eine App auf dem Handy — aber das alles lief noch unter einem alten Codenamen. Den musste ich aus juristischen Gründen ablegen, bevor das Tool öffentlich werden konnte.

Teil 4: Vom Tool für mich zum OSS-Projekt


Teil 3 von 9 der PullMD Serie.

PullMD Teil 2: Vom Spec zum laufenden Container | PullMD Teil 4: Vom Tool für mich zum OSS-Projekt