trafilatura liet meer gelabelde boilerplate door dan Readability op dezelfde fixtures

Laatst bijgewerkt op August 17, 2026
trafilatura liet meer gelabelde boilerplate door dan Readability op dezelfde fixtures
AI-samenvatting
trafilatura is een Python-contentextractor zonder browser. In de gelabelde fixtures in dit artikel is Mozilla Readability de enige tegenhanger met dezelfde HTML-extractiekwaliteit: trafilatura liet één van de 17 geannoteerde boilerplate-eenheden door, terwijl Readability er vijf doorliet. Tools die op een browser steunen komen hier alleen ter sprake in de context van implementatie-footprint en zijn op deze pagina’s niet op kwaliteit getest. De kernfunctie is het extraheren van hoofdinhoud: HTML erin, tekst en metadata met focus op artikelen eruit, waarbij paginaresten via heuristieken worden weggefilterd. De output kan worden geserialiseerd naar JSON en andere formaten, maar er ontstaat geen door de gebruiker gedefinieerd rijschema of een reeks terugkerende, getypeerde catalogusrecords.

trafilatura is een Python-contentextractor zonder browser. In de gelabelde testbestanden van dit artikel is Mozilla Readability de enige tegenhanger met vergelijkbare HTML-extractiekwaliteit: trafilatura liet 1 van de 17 geannoteerde boilerplate-onderdelen doorschijnen, terwijl Readability er 5 miste. Tools met browser-ondersteuning komen hier alleen voorbij in de context van deployment-footprint en zijn op deze pagina’s niet op kwaliteit getest.

trafilatura title and 3/3 paragraphs retained

De kerntaak is main-content-extractie: HTML erin, tekst en metadata rondom het artikel eruit, terwijl pagina-opmaak op basis van heuristieken wordt gefilterd. De output kan worden opgeslagen als JSON en andere formaten, maar het produceert geen door de gebruiker gedefinieerd rijschema of herhaalde, getypeerde catalogusrecords. Versie 2.1.0 is getest. JavaScript wordt niet uitgevoerd, en de vergelijking met Readability laat vooral een afweging zien tussen precisie en behoud, geen allesoverheersende overwinning.

Waar trafilatura past, en wat het juist niet probeert te doen

trafilatura omschrijft zichzelf als een Python- en commandline-tool om tekst en metadata van het web te verzamelen — crawlen, scrapen, extractie — met output in CSV, JSON, HTML, Markdown, TXT of XML. Dat klinkt breed. In de praktijk is het deel waarvoor je de tool inzet een stuk scherper: je geeft een HTML-document en krijgt de hoofdinoud terug, ontdaan van de omliggende pagina-opmaak.

System diagram: Where trafilatura fits, and what it refuses to do

Dit mentale model verklaart zowel de kracht als de grens. De meeste scrapers die je op een pagina loslaat werken met selectors: je zegt bijvoorbeeld “pak het element met class product-price”, en je krijgt terug wat daar staat. trafilatura werkt andersom. Het leest het hele document en bepaalt welke blokken echt artikelinhoud zijn en welke boilerplate, met contentheuristieken in plaats van een zelfgeschreven selector. Daarom zijn er geen per-site regels nodig om een pagina op te schonen. En precies daarom kan het je geen gestructureerde catalogus aanreiken: er is geen schema, geen getypeerde rijen, alleen “hier is de relevante tekst”. Het is een extractor, geen parser die je gericht aanspreekt.

Ook is er geen apart gedownloade browserruntime nodig. De dependency tree bevat platformwheels zoals lxml, dus “geen browser downloaden” betekent niet dat de installatie puur uit broncode bestaat of geen native onderdelen gebruikt.

Installatie: klein dependency-profiel, geen browserinstallatie

pip install trafilatura in een verse virtualenv op Python 3.14 installeerde 17 pakketten; de grootste vastgelegde wheel was lxml met 8,6 MB, volgens pip-install-trafilatura.log. Er was geen aparte browserinstallatie of browsercommando na de installatie nodig.

Ter vergelijking: de Scrapling-pack in dezelfde onderzoeksbasis had vier aparte pip-run nodig om de fetchers werkend te krijgen en kwam uit op 26 pakketten, waarvan twee Playwright-driverwheels van 42,2 MB waren (tools/scrapling/artifacts/logs/pip-install-scrapling.log) — en dat is nog vóórdat een browserbinary wordt gedownload. De Crawlee-pack mat die losse Chromium-download op ongeveer 81,7 MiB (tools/crawlee/research-materials.md). Die tools doen meer, dus dit is geen eerlijke vergelijking op mogelijkheden; het zegt alleen iets over wat je schijf en CI-cache zien. En de versie die pip gaf (2.1.0) is gelijk aan de huidige release, dus er staat geen “je hebt iets ouds getest”-voetnoot op de cijfers hieronder.

Praktijk: wat de extractor daadwerkelijk teruggaf

trafilatura boilerplate cleanup

Ik heb de tool getest op fixtures die zowel zijn sterke kant als zijn grens raken, met de ruwe output opgeslagen in de benchmark-repo. De artikeltest was degene die mij overtuigde.

Ik nam een lokale article-fixture en stopte de echte inhoud in ruis: een inlogprompt, een “Subscribe”-melding, navigatielinks, een copyright-voettekst — de standaard boilerplate die een naïeve scraper samen met de body binnenhaalt. trafilatura gaf de titel plus alle 3 van 3 alinea’s terug, en elk van die boilerplate-markers — Login, Subscribe, Copyright — ontbrak in de output. Daarnaast haalde het de auteur en datum correct uit de paginametadata. Het volledige resultaat, in .txt, .md en .json, staat in results/local_article.json.

Diezelfde opgeslagen HTML is geëxporteerd als platte tekst, Markdown en JSON. Dit artikel bewijst niet dat al die drie formaten uit één gelijktijdige call kwamen; het zijn alternatieve serialisaties van hetzelfde extractiepad. JSON bundelt hier geëxtraheerde tekst en metadata, niet door de gebruiker gedefinieerde herhaalde records.

Hier staat de eerste run bij elkaar, zodat je de claims kunt controleren in plaats van ze zomaar aan te nemen:

FixtureWat kwam terugDoorlooptijdBewijs
Lokale artikel-fixture, omgeven door nav / login / subscribe / copyrighttitel + 3/3 alinea’s, nul boilerplate-secties gelekt, auteur Thunderbit Research Lab, datum 2026-07-090.007 slocal_article.json
Lokale productcatalogus12 productnamen en hun 12 prijzen als platte tekst, 0 gestructureerde rijen, 478 tekens0.064 slocal_catalog_extraction.txt
Pagina die HTTP 500 teruggeeftfetch_url gaf None terug, zonder exception30.012 slocal_failure_500.json
Books to Scrape productpagina (publiek)1.324 tekens aan schone tekst, plus de Markdown-tegenhanger0.753 spublic_books_product.txt / .md

Elke rij komt uit artifacts/raw/trafilatura-test-summary.json in de trafilatura-pack — trafilatura 2.1.0, Python 3.14, macOS arm64, één run op één machine. Zie de tijden als observaties, niet als een benchmark.

Op de 500-fixture gaf fetch_url na ongeveer 30 seconden None terug, terwijl nabije lokale endpoints snel waren. Deze run toont de vertraging aan, maar niet of retry/backoff, een vaste timeout of een andere interne route de oorzaak was. In dit artikel is geen ondersteunde per-call timeoutparameter voor fetch_url geverifieerd; de aangetoonde aanpak is om met een door de aanvrager gecontroleerde client op te halen en de resulterende HTML vervolgens aan trafilatura te geven.

trafilatura catalog text-only boundary

Dezelfde tests laten ook drie grenzen zien.

Ten eerste en het belangrijkst: trafilatura is een content extractor, geen structured scraper. Ik draaide het op een catalogus-fixture. Het gaf alle 12 productnamen — als tekst — en exact 0 gestructureerde rijen terug (478 tekens platte tekst, volgens results/local_catalog_extraction.txt). De prijzen kwamen ook mee, van $18.00 tot $51.00, elk op een eigen regel onder de naam. Alles wat je nodig hebt staat in de output; niets ervan is een veld. Als je [{name, price, rating}, …] nodig hebt, is dit het verkeerde gereedschap en geen enkele configuratie verandert dat — het is een ontwerpkeuze, geen bug.

trafilatura no JavaScript render boundary

Ten tweede: het rendert geen JavaScript. Het verwerkt statische HTML. Geef het een client-side gerenderde pagina en je krijgt terug wat de server vóór het uitvoeren van JavaScript stuurde, wat vaak niets bruikbaars is. Combineer het met een renderer als je doelen sterk op JS leunen; trafilatura doet dat deel niet voor je.

Ten derde, een kanttekening bij mijn eigen bewijs: die eerste publieke extractietest gebruikte een productbeschrijvingsblok, geen echte nieuwsartikelen, omdat de publieke sandbox geen nieuwspagina’s bevat. Het resultaat voor artikelopschoning hierboven komt uit een gecontroleerde lokale fixture. Ik vertrouw het — de verwijdering van boilerplate is onmiskenbaar — maar ik wilde een productpagina niet verkleden als bewijs voor newsroom-kwaliteit extractie, dus werd die ontbrekende referentie expliciet vastgelegd. Een vervolgrun op 2026-07-14 vulde dat gat, en de resultaten staan in het volgende deel.

Sanity check op boilerplate op echte pagina’s

trafilatura boilerplate labels removed

Twee echte pagina’s zijn één keer opgehaald, opgeslagen als offline fixtures met SHA-256-hashes en daarna opnieuw gedraaid zonder netwerktoegang. Er is geen timing of gelabelde ground truth vastgelegd. Dit is een sanity check op boilerplate op echte pagina’s, geen nauwkeurigheidsscore.

Fixture van echte artikelenRuwe HTMLGeëxtraheerde bodyBody/rawMarkers van pagina-opmaak verwijderdtitledatehostnameauthorsitename
Wikipedia, "Web scraping"230.049 bytes26.673 bytes0.1164 van 4ja2005-09-17wikipedia.orgnullnull
Wikinews, "7th Heaven" (gearchiveerd)79.716 bytes2.200 bytes0.0285 van 5ja2005-11-29wikinews.orgnullnull

Beide rijen komen uit artifacts/results/trafilatura-fidelity-summary.json. De gecontroleerde markers waren “Jump to content”, “Privacy policy”, “Powered by MediaWiki”, “This page was last edited”, plus “free news source” op de Wikinews-pagina — allemaal verdwenen, niets lekte door, op beide pagina’s.

De body/raw-ratio meet reductie, niet nauwkeurigheid; weggelaten artikelinhoud is niet gescoord. author en sitename waren null op deze twee MediaWiki-templates, terwijl de gecontroleerde lokale fixture wel een auteur leverde. Dit is een MediaWiki-specifieke misser uit de test, geen bewijs voor algemene betrouwbaarheid van bylines. De geëxtraheerde datums worden gerapporteerd zoals ze zijn teruggegeven en zijn niet vergeleken met ground truth.

Twee extractors, dezelfde HTML-bytes, één scoringsscript

System diagram: Two extractors, the same HTML bytes, one scoring script

Er is precies één vergelijking binnen dezelfde testomgeving van trafilatura in deze onderzoeksbasis, en die is niet door trafilatura’s eigen pack gebouwd. De mozilla-readability-pack deed dat als controle-arm: 22 hand-gelabelde fixtures waarin elk tekstblok is getagd als ARTICLE of BOILERPLATE en elk woord een unieke sentinel-token heeft, zodat een geëxtraheerd woord exact naar één gelabeld blok terug te herleiden is. Beide tools kregen identieke HTML-bytes. Readability draaide onder jsdom 29.1.1 op Node v22.22.3; trafilatura gebruikte zijn eigen parser.

Metriek (micro-averaged, content-fidelity set)trafilatura 2.1.0@mozilla/readability 0.6.0Bewijs
Herstelde article units40 van 4040 van 40comparison.json
Gelekte boilerplate units1 van 175 van 17comparison.json
Boilerplate tokens die de output vervuilen341comparison.json
Token precision0.9390.902comparison.json
Token F10.9690.948comparison.json
Non-prose recall, f6_nonprose fixture7 van 88 van 8comparison.json
Zeer kort artikel, f3_short_120 F10.5710.800comparison.json

Bron: tools/mozilla-readability/artifacts/raw/comparison.json in deze onderzoeksbasis — 11 fixtures in de content-fidelity set, 40 article units en 17 boilerplate units. Dit zijn synthetische fixtures, bewust zwaarder gericht op lastige gevallen, dus lees ze als mechanisme en niet als ranglijst over een echte corpus.

Geen van beide tools veegt alles weg, en juist dat verschil is interessant. trafilatura houdt de rommel buiten de deur — één gelekt blok tegenover vijf bij Readability, drie vervuilende tokens tegenover 41. Dat is de precisiekant van “schone artikeltekst”, en die bepaalt of je LLM-contextvenster volloopt met zijbalklinks. Maar Readability haalt content terug die trafilatura weggooit: op de non-prose-fixture liet trafilatura een <figcaption> vallen die Readability behield, en op een zeer kort artikel scoorde het 0.571 tegenover Readability’s 0.800. Agressief opschonen is een afweging, geen gratis winst. Als je corpus vol samenvattingen, bijschriften en pagina’s met veel tabellen zit, werkt die afweging tegen je.

Hoe je de vergelijking omzet in een selectietest

Begin met vaststellen welke fout duurder is voor je pipeline. Als pagina-opmaak downstream tokens opsoupeert of zoekresultaten vervuilt, dan moeten boilerplate-lekkage en vervuilende-tokenaantallen zwaarder wegen. Als het verliezen van een bijschrift, kort bericht of non-prose-blok onacceptabel is, dan moet content-recall op basis van paginavorm zwaarder wegen. De gedeelde fixture-set maakt die afweging zichtbaar, maar kiest de weging niet voor een newsroom-archief, documentatiecorpus of retrieval-pipeline.

De bredere stresstestcontext staat in de vergelijking van tien bibliotheken op geheugen en foutieve HTML.

Bouw de bake-off op basis van opgeslagen HTML in plaats van live URL’s, zodat beide extractors identieke bytes krijgen. Neem gewone lange artikelen, korte meldingen, stukken met veel bijschriften, documenten met veel tabellen of code, en templates van elke uitgever die je echt verwerkt. Label vooraf een klein aantal verplichte content-units en bekende boilerplate-blokken voordat je een van beide tools draait. Scoreer daarna lege output, herstel van verplichte units, lek van ongewenste units en metadata-velden apart. Eén samengestelde “kwaliteitsscore” kan precies de failure mode verbergen die operationeel het belangrijkst is.

Valideer ook het outputcontract downstream. trafilatura’s JSON kan geëxtraheerde content en metadata bevatten, maar een JSON-serialisatie is niet hetzelfde als een getypeerd rijschema. Controleer voor artikeltekst een minimale bodylengte en verplichte markers in plaats van elke niet-lege output te accepteren. Maak voor metadata onderscheid tussen afwezigheid en onjuiste waarden, en bewaar de bron-URL plus extractieversie zodat missers opnieuw kunnen worden uitgevoerd.

Ophalen moet als aparte laag worden getest. De observatie van de 30 seconden durende lokale fout hoort bij fetch_url, niet bij extractie uit al beschikbare HTML, en het interne mechanisme is niet vastgesteld. Als deadlines, retries, authenticatie of proxybeleid belangrijk zijn, gebruik dan een client waarvan je het gedrag controleert, leg de uiteindelijke response-bytes vast en geef die bytes door aan de extractor. Zo scheid je acquisitiefouten van contentselectiefouten en worden vergelijkingen reproduceerbaar.

Meet ten slotte de deployment-eigenschappen op het beoogde platform. De Python 3.14-installatie met 17 pakketten had geen aparte browser nodig, maar dat zegt niets over throughput, geheugengroei, wheel-beschikbaarheid op elke architectuur of gedrag onder gelijktijdige workers. Het artikel laat een nuttige precisie/retentie-afweging zien tegenover Readability; productierijpheid hangt nog steeds af van corpus en runtime-tests.

Als externe controle die niet uit deze basis zelf komt: trafilatura’s eigen evaluatiepagina en de publieke ScrapingHub article-extraction-benchmark plaatsen het beide boven readability-lxml op woord-F1 over ongeveer 181 echte pagina’s — dezelfde richting als in de tabel hierboven. Eén kanttekening die in veel verwijzingen naar die benchmark ontbreekt: de vaak geciteerde trafilatura F1 (~0.945) hoort bij een oudere 0.5.1-lijn, niet bij de hier geteste 2.1.0.

Voor- en nadelen

Voordelen:

  • Minder gelabelde boilerplate-lekkage dan Readability op de gedeelde fixture-set: 1 blok van 17 versus 5.
  • Auteur en datum werden correct opgehaald op de lokale fixture, en titel/datum/hostname op beide echte artikelpagina’s.
  • Dezelfde HTML kan worden geserialiseerd als tekst, Markdown of JSON.
  • Installatie met 17 pakketten en geen aparte browserruntime.
  • Mislukkingen zijn stil: fetch_url geeft None terug bij HTTP 500 in plaats van een exception te gooien.
  • Geteste versie is gelijk aan de nieuwste (2.1.0) — geen versie-drift.
  • Gelicenseerd onder Apache-2.0 — permissief en commercieel vriendelijk.

Nadelen:

  • Geen structured scraper: de catalogustest gaf 12 namen en 12 prijzen als tekst terug en 0 getypeerde rijen. Geen schema, geen velden.
  • Geen JavaScript-rendering — alleen statische HTML; voor client-side pagina’s is een aparte renderer nodig.
  • author en sitename kwamen null terug op beide echte MediaWiki-pagina’s, dus byline-extractie is niet vanzelfsprekend.
  • Agressief opschonen heeft een prijs: het liet een <figcaption> vallen die Readability behield, en scoorde 0.571 tegenover Readability’s 0.800 op een zeer kort artikel.
  • Die stille 500 deed er 30.012 seconden over om None terug te geven; gebruik een fetcher onder controle van de aanvrager als deadlinecontrole belangrijk is.
  • De ingebouwde crawl/sitemap-spider en CSV/XML-outputformaten zijn in deze run niet getest, dus daar doe ik geen uitspraken over.

Voor wie het geschikt is — en wie beter kan overslaan

trafilatura is bedoeld voor article-oriented main-content extractie. Het is een goede kandidaat voor het bouwen van tekstcorpora, leesbare archieven of NLP-inputs uit statische HTML wanneer heuristische opschoning acceptabel is. De vergelijking op de gedeelde fixtures ondersteunt minder boilerplate-lekkage dan Readability, terwijl Readability meer behield in de korte en non-prose-gevallen.

Sla het over als je eigenlijk gestructureerde extractie nodig hebt — productrijen met prijs, getypeerde records, key: value-velden — want het geeft tekst, geen tabellen (de catalogustest herstelde alle 12 namen en alle 12 prijzen, en 0 rijen). Sla het ook over als je targets hun content in de browser renderen en je geen aparte renderer wilt toevoegen, omdat trafilatura statische HTML leest en daar stopt. En denk twee keer na als je corpus vooral uit korte snippets, afbeeldingsbijschriften en tabelzware pagina’s bestaat: op de gelabelde fixtures is dat precies waar de opschoning in echte content snijdt (0.571 F1 op het zeer korte artikel, een weggelaten <figcaption>). Stem de tool af op de klus: volledige artikeltekst, ja; gestructureerde JSON, JS-pagina’s of snippets van 100 woorden, kijk elders.

Alternatieven, inclusief waar Thunderbit past

trafilatura is een zelf gehoste Apache-2.0-bibliotheek zonder vendorfee per call; compute, bandwidth, fetching, monitoring en onderhoud blijven operationele kosten. Het verwerkt article-oriented extractie uit aangeleverde HTML, maar geen browseruitvoering of door de gebruiker gedefinieerde schema’s met herhaalde rijen.

Voor dezelfde fixtures over alle zes extractors, zie de vergelijking van zes bibliotheken voor extractie.

Een managed service kan acquisitie, rendering en schema-opbouw achter een vendorgrens plaatsen. Wij bouwen Thunderbit, maar hebben die niet op deze fixtures getest, dus dit artikel ondersteunt geen vergelijking op kwaliteit, rendering, latency, anti-bot of kosten. De keuze is zelf gehoste HTML-naar-contentcontrole versus een gehoste grens voor acquisitie en gestructureerde extractie.

Gerelateerde benchmarkreviews: de volledige vergelijking van open-source scrapers, Crawl4AI’s browser-ondersteunde Markdown-review en Firecrawl’s self-hosted Markdown-review.

Probeer Thunderbit voor webdata-extractie

Eindoordeel

Overweeg trafilatura wanneer de taak bestaat uit article-oriented extractie uit statische HTML en je prioriteit het afwijzen van gelabelde boilerplate is. Op de gedeelde fixtures lekte het één geannoteerde boilerplate-unit, tegenover vijf bij Readability. Dat voordeel kwam wel met minder behoud op de zeer korte en non-prose-fixtures, dus de vorm van je corpus moet de keuze bepalen.

Het voert geen JavaScript uit en produceert geen door de gebruiker gedefinieerde herhaalde rijen. Op de twee MediaWiki-pagina’s waren author en sitename null, een observatie die beperkt is tot die templates. Readability behield het bijschrift dat trafilatura liet vallen en scoorde hoger op de fixture f3_short_120; het zichtbare bewijs ondersteunt “lagere F1 op de zeer korte fixture”, niet een tekenaantal of een claim dat de output verminkt was.

Probeer Thunderbit voor webdata-extractie Get Started Free

Veelgestelde vragen

Welke structuur geeft trafilatura terug? Het kan geëxtraheerde content en metadata serialiseren als JSON, Markdown, tekst, HTML, XML of CSV. Dat is gestructureerde serialisatie, maar geen door de gebruiker gedefinieerd rijschema zoals productnaam, prijs en beoordeling. De catalogus-fixture gaf waarden terug als platte content, niet als getypeerde rijen.

Kan trafilatura een productcatalogus in gestructureerde rijen scrapen? Nee. Het is een content extractor, geen structured scraper. Op een catalogus-fixture gaf het alle 12 productnamen als platte tekst terug en 0 gestructureerde rijen — de namen staan in de output, maar niet als velden. Als je getypeerde records nodig hebt zoals naam/prijs/beoordeling, gebruik dan een parser op basis van selectors of een schema-gedreven extractie-API.

Rendert trafilatura JavaScript? Nee. Het verwerkt alleen statische HTML. Geef het een client-side gerenderde pagina en je krijgt terug wat de server vóór het draaien van JavaScript stuurde, wat vaak niet de content is die je zoekt. Combineer het met een aparte renderer als je targets zwaar op JS leunen.

Is trafilatura lastig te installeren? In de geteste Python 3.14-virtualenv haalde de installatie 17 pakketten binnen en was er geen aparte browserruntime nodig. De grootste vastgelegde wheel was lxml met 8,6 MB. Daarnaast deed één lokale 500-call er 30.012 seconden over om None terug te geven; gebruik een door de aanvrager gecontroleerde HTTP-client als je een verifieerbare deadline nodig hebt.

Is trafilatura gratis voor commercieel gebruik? Ja, het heeft een Apache-2.0-licentie, dus permissief en commercieel vriendelijk. Controleer zoals altijd de huidige licentie in de repo voordat je erop bouwt.

Ke
Ke
CTO bij Thunderbit | Senior Data Scientist & ML-expert Met bijna tien jaar ervaring in machine learning en data science is Ke Shen alumnus van Columbia University en voormalig Senior Data Scientist bij Walmart Labs. Met diepgaande, door vakgenoten erkende expertise in Python, R, Java en statistiek deelt hij praktijkgerichte inzichten over hoe je complexe AI-algoritmen van theorie naar productieklare architectuur brengt.
Inhoudsopgave
Thunderbit · AI-webdata-agent

Gegevens extraheren van elke pagina in 1 klik

Vertrouwd door meer dan 250.000 gebruikers
gratis abonnement beschikbaar
Van webpagina naar spreadsheet
Beschrijf wat je nodig hebt — Thunderbit's AI Agent scrapt het en exporteert het naar Excel, Google Sheets, Airtable of Notion. Gratis om te starten.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week