trafilatura adalah content extractor Python tanpa browser. Dalam fixture berlabel di artikel ini, satu-satunya lawan yang kualitas ekstraksinya dari HTML yang sama mendekati adalah Mozilla Readability: trafilatura melewatkan 1 dari 17 unit boilerplate yang dianotasi, sementara Readability melewatkan 5. Alat yang ditopang browser hanya muncul dalam konteks jejak deployment dan tidak diuji kualitasnya pada halaman-halaman ini.

Tugas utamanya adalah mengekstrak konten utama: HTML masuk, teks dan metadata bergaya artikel keluar, sementara elemen-elemen pelengkap halaman disaring lewat heuristik. Hasilnya bisa diserialisasikan ke JSON dan format lain, tetapi tidak menghasilkan schema baris buatan pengguna atau record katalog bertipe yang berulang. Versi 2.1.0 yang diuji. Alat ini tidak menjalankan JavaScript, dan perbandingan dengan Readability menunjukkan adanya kompromi antara ketelitian dan retensi, bukan kemenangan mutlak di semua kategori.
Posisi trafilatura, dan apa yang memang tidak ingin ia lakukan
trafilatura mendeskripsikan dirinya sebagai alat Python dan command-line untuk mengumpulkan teks dan metadata di web — crawling, scraping, extraction — dengan output CSV, JSON, HTML, Markdown, TXT, atau XML. Klaimnya luas. Namun dalam praktik, bagian yang benar-benar menjadi kekuatan alat ini jauh lebih sempit dan tajam: ia mengambil sebuah dokumen HTML lalu mengembalikan konten utama yang sudah dibersihkan dari elemen pelengkap halaman.

Inilah model mentalnya, karena dari situlah kekuatan sekaligus batasannya terlihat. Kebanyakan scraper yang diarahkan ke sebuah halaman bekerja berbasis selector — Anda bilang, “ambil elemen dengan class product-price,” lalu mereka mengembalikan isi di alamat itu. trafilatura bekerja kebalikannya. Ia membaca seluruh dokumen lalu menentukan blok mana yang benar-benar isi artikel dan mana yang cuma boilerplate, memakai heuristik konten, bukan selector yang Anda tulis. Karena itulah ia tidak butuh aturan khusus per situs untuk membersihkan halaman. Dan justru itu juga sebabnya ia tidak bisa langsung memberi Anda katalog terstruktur: tidak ada schema, tidak ada baris bertipe, hanya “ini teks yang bermakna.” Ia adalah extractor, bukan parser yang diarahkan.
Alat ini juga tidak memerlukan browser runtime yang harus diunduh terpisah. Dependency tree-nya mencakup wheel platform seperti lxml, jadi “tanpa download browser” jangan disamakan dengan instalasi source-only atau tanpa native code.
Setup: dependency kecil, tanpa instalasi browser
pip install trafilatura di virtualenv baru pada Python 3.14 memasang 17 paket; wheel terbesar yang tercatat adalah lxml sebesar 8,6 MB, menurut pip-install-trafilatura.log. Tidak diperlukan instalasi browser terpisah atau perintah browser pasca-instalasi.
Untuk skala perbandingan, paket Scrapling dalam basis riset yang sama membutuhkan empat perintah pip terpisah agar fetcher-nya berjalan dan berakhir dengan 26 paket, dua di antaranya wheel driver Playwright 42,2 MB (tools/scrapling/artifacts/logs/pip-install-scrapling.log) — itu pun belum termasuk download binary browser. Paket Crawlee mencatat download Chromium terpisah sekitar ~81,7 MiB (tools/crawlee/research-materials.md). Alat-alat itu memang menangani pekerjaan yang lebih besar, jadi ini bukan perbandingan yang adil dari sisi kapabilitas; ini cuma apa yang dilihat disk dan cache CI Anda. Dan versi yang diberikan pip kepada saya (2.1.0) sama dengan rilis terkini, jadi tidak ada catatan “yang diuji sudah usang” pada angka-angka di bawah ini.
Uji langsung: apa yang benar-benar dikembalikan extractor

Saya menjalankannya pada fixture yang dirancang untuk menyentuh titik kuat sekaligus batasnya, dengan output mentah disimpan di repo benchmark. Uji artikel adalah yang paling meyakinkan.
Saya mengambil fixture artikel lokal lalu membungkus konten aslinya dengan noise: prompt login, ajakan “Subscribe”, tautan navigasi, footer hak cipta — boilerplate standar yang biasanya ikut terseret scraper naif bersama isi halaman. trafilatura mengembalikan judul plus 3 dari 3 paragraf isi, dan semua penanda boilerplate itu — Login, Subscribe, Copyright — hilang dari output. Di samping teks, ia juga mengambil author dan tanggal dengan benar dari metadata halaman. Hasil lengkap dalam .txt, .md, dan .json ada di results/local_article.json.
HTML yang sama kemudian diekspor sebagai plain text, Markdown, dan JSON. Artikel ini tidak membuktikan bahwa ketiga format itu berasal dari satu pemanggilan simultan; ketiganya adalah serialisasi alternatif dari jalur ekstraksi yang sama. JSON di sini membungkus teks dan metadata hasil ekstraksi, bukan record berulang yang ditentukan pengguna.
Berikut hasil run pertama secara lengkap, supaya Anda bisa memeriksa klaim di atas sendiri:
| Fixture | Hasil | Waktu eksekusi | Bukti |
|---|---|---|---|
| Artikel lokal, dibungkus nav / login / subscribe / copyright | judul + 3/3 paragraf, nol bagian boilerplate lolos, author Thunderbit Research Lab, tanggal 2026-07-09 | 0.007 s | local_article.json |
| Katalog produk lokal | 12 nama produk dan 12 harga sebagai teks datar, 0 baris terstruktur, 478 karakter | 0.064 s | local_catalog_extraction.txt |
| Halaman mengembalikan HTTP 500 | fetch_url mengembalikan None, tanpa exception | 30.012 s | local_failure_500.json |
| Halaman produk Books to Scrape (publik) | 1.324 karakter teks bersih, plus versi Markdown | 0.753 s | public_books_product.txt / .md |
Setiap baris diambil dari artifacts/raw/trafilatura-test-summary.json dalam paket trafilatura — trafilatura 2.1.0, Python 3.14, macOS arm64, satu run di satu mesin. Angka waktu itu sebaiknya dibaca sebagai observasi, bukan benchmark.
Pada fixture 500, fetch_url mengembalikan None setelah sekitar 30 detik sementara endpoint lokal di sekitarnya cepat. Run ini membuktikan adanya delay, bukan apakah penyebabnya retry/backoff, timeout tetap, atau jalur internal lain. Artikel ini tidak memverifikasi parameter timeout per-call yang didukung untuk fetch_url; kontrol yang terbukti adalah mengambil HTML dengan client yang dikendalikan pemanggil lalu menyerahkan HTML tersebut ke trafilatura.

Uji yang sama juga menampilkan tiga batasan.
Pertama dan paling penting: trafilatura adalah content extractor, bukan structured scraper. Saya menjalankannya pada fixture katalog produk. Ia mengembalikan semua 12 nama produk — sebagai teks — dan tepat 0 baris terstruktur (478 karakter teks datar, menurut results/local_catalog_extraction.txt). Harganya juga ikut terbaca, dari $18.00 sampai $51.00, masing-masing berdiri di baris sendiri di bawah namanya. Semua informasi yang Anda inginkan memang ada di output; tetapi tidak satu pun menjadi field. Jika yang Anda butuhkan adalah [{name, price, rating}, …], ini bukan alat yang tepat, dan tidak ada konfigurasi yang bisa mengubah itu — itu keputusan desain, bukan bug.

Kedua: alat ini tidak merender JavaScript. Ia hanya memproses HTML statis. Arahkan ke halaman yang dirender di sisi klien, dan Anda hanya akan mendapat apa yang dikirim server sebelum JS berjalan — sering kali tidak berguna. Pasangkan dengan renderer kalau target Anda berat di JS; trafilatura tidak akan mengerjakan setengah pekerjaan itu untuk Anda.
Ketiga, satu catatan atas bukti saya sendiri: uji ekstraksi publik pertama itu menggunakan blok deskripsi produk, bukan artikel berita sungguhan, karena sandbox publik tidak memiliki halaman berita. Hasil pembersihan artikel di atas berasal dari fixture lokal yang terkontrol. Saya percaya hasil itu — penghapusan boilerplate-nya jelas — tetapi saya tidak mau menyamarkan halaman produk seolah-olah itu bukti ekstraksi setara ruang redaksi, jadi paketnya mencatatnya sebagai celah terbuka. Run lanjutan pada 2026-07-14 menutup celah itu, dan hasilnya ada di bagian berikutnya.
Pemeriksaan boilerplate pada halaman nyata

Dua halaman nyata diambil sekali, disimpan sebagai fixture offline dengan hash SHA-256, lalu dijalankan ulang tanpa akses jaringan. Tidak ada pencatatan timing atau ground truth berlabel. Ini adalah pemeriksaan kebersihan boilerplate pada halaman nyata, bukan skor fidelitas.
| Fixture artikel nyata | HTML mentah | Body hasil ekstraksi | Rasio body/raw | Penanda furniture halaman yang dihapus | title | date | hostname | author | sitename |
|---|---|---|---|---|---|---|---|---|---|
| Wikipedia, "Web scraping" | 230,049 bytes | 26,673 bytes | 0.116 | 4 dari 4 | ya | 2005-09-17 | wikipedia.org | null | null |
| Wikinews, "7th Heaven" (arsip) | 79,716 bytes | 2,200 bytes | 0.028 | 5 dari 5 | ya | 2005-11-29 | wikinews.org | null | null |
Kedua baris berasal dari artifacts/results/trafilatura-fidelity-summary.json. Penanda yang diperiksa adalah "Jump to content", "Privacy policy", "Powered by MediaWiki", "This page was last edited", plus "free news source" pada halaman Wikinews — semuanya dihapus, tidak ada yang lolos, pada kedua halaman.
Rasio body/raw mengukur pengurangan ukuran, bukan akurasi; konten artikel yang terlewat tidak dinilai. author dan sitename bernilai null pada dua template MediaWiki ini, sedangkan fixture lokal yang terkontrol menyediakan author. Ini adalah miss yang tampak pada MediaWiki dalam pengujian, bukan bukti keandalan byline secara umum. Tanggal yang diekstrak dilaporkan apa adanya dan tidak diverifikasi terhadap ground truth.
Dua extractor, bytes HTML yang sama, satu skrip penilaian

Hanya ada satu perbandingan di testbed yang sama untuk trafilatura dalam basis riset ini, dan paket trafilatura sendiri tidak membangunnya. Paket mozilla-readability yang membuatnya, sebagai kelompok kontrol: 22 fixture berlabel manual di mana setiap blok teks diberi tag ARTICLE atau BOILERPLATE dan setiap kata membawa token sentinel unik, sehingga satu kata hasil ekstraksi bisa dilacak ke tepat satu blok berlabel. Kedua alat menerima bytes HTML yang identik. Readability dijalankan di bawah jsdom 29.1.1 pada Node v22.22.3; trafilatura menjalankan parser-nya sendiri.
| Metrik (micro-averaged, content-fidelity set) | trafilatura 2.1.0 | @mozilla/readability 0.6.0 | Bukti |
|---|---|---|---|
| Unit artikel yang dipulihkan | 40 dari 40 | 40 dari 40 | comparison.json |
| Unit boilerplate yang lolos | 1 dari 17 | 5 dari 17 | comparison.json |
| Token boilerplate yang mencemari output | 3 | 41 | comparison.json |
| Precision token | 0.939 | 0.902 | comparison.json |
| F1 token | 0.969 | 0.948 | comparison.json |
Recall non-prose, fixture f6_nonprose | 7 dari 8 | 8 dari 8 | comparison.json |
Artikel sangat pendek, F1 f3_short_120 | 0.571 | 0.800 | comparison.json |
Sumber: tools/mozilla-readability/artifacts/raw/comparison.json di basis riset ini — 11 fixture dalam content-fidelity set, 40 unit artikel, dan 17 unit boilerplate. Ini adalah fixture sintetis yang sengaja diberi bobot ke kasus-kasus adversarial, jadi bacalah sebagai mekanisme, bukan sebagai ranking korpus nyata.
Tidak satu pun alat menyapu bersih semuanya, dan justru perpecahannya itulah yang menarik. trafilatura menjaga elemen chrome tetap keluar — satu blok yang lolos dibanding lima milik Readability, tiga token yang mencemari output dibanding 41. Itulah sisi precision dari “teks artikel yang bersih”, dan itu pula yang menentukan apakah jendela konteks LLM Anda dipenuhi tautan sidebar. Namun Readability memulihkan konten yang dibuang trafilatura: pada fixture non-prose, trafilatura membuang <figcaption> yang dipertahankan Readability, dan pada artikel yang sangat pendek skornya 0,571 dibanding 0,800 milik Readability. Pembersihan yang agresif adalah trade-off, bukan kemenangan gratis. Jika korpus Anda penuh stub, caption, dan halaman sarat tabel, kompromi itu justru merugikan.
Cara mengubah perbandingan ini menjadi tes seleksi
Mulailah dengan mendefinisikan error mana yang paling mahal untuk pipeline Anda. Jika elemen pelengkap halaman menghabiskan token downstream atau mencemari hasil pencarian, maka kebocoran unit boilerplate dan jumlah token pencemar patut diberi bobot lebih besar. Jika kehilangan caption, posting pendek, atau blok non-prose tidak bisa diterima, maka recall konten berdasarkan bentuk halaman patut diberi bobot lebih besar. Set fixture yang sama membuat trade-off ini terlihat, tetapi tidak memilihkan bobot untuk arsip newsroom, korpus dokumentasi, atau pipeline retrieval Anda.
Konteks stress-test yang lebih luas ada di perbandingan memori dan HTML rusak untuk sepuluh library.
Bangun bake-off dari HTML tersimpan, bukan URL live, agar kedua extractor menerima bytes yang identik. Sertakan artikel panjang biasa, pengumuman pendek, tulisan berat caption, dokumen berat tabel atau kode, dan template dari setiap publisher yang benar-benar Anda konsumsi. Labeli sejumlah kecil unit konten wajib dan blok furniture yang sudah diketahui sebelum menjalankan salah satu alat. Lalu nilai output kosong, pemulihan unit wajib, kebocoran unit yang tidak diinginkan, dan field metadata secara terpisah. Satu skor agregat “kualitas” bisa menyembunyikan mode kegagalan yang justru paling penting secara operasional.
Validasi juga kontrak output di downstream. JSON trafilatura bisa membawa konten hasil ekstraksi dan metadata, tetapi serialisasi JSON bukan berarti schema baris bertipe. Untuk teks artikel, cek panjang body minimum dan penanda wajib, bukan sekadar menerima output apa pun yang tidak kosong. Untuk metadata, bedakan absennya nilai dengan nilai yang salah, dan simpan URL sumber plus versi ekstraksi agar miss bisa diputar ulang.
Pengambilan data juga harus diuji sebagai lapisan tersendiri. Observasi kegagalan lokal 30 detik itu milik fetch_url, bukan ekstraksi dari HTML yang sudah dipegang, dan mekanisme internalnya tidak ditetapkan. Jika deadline, retry, autentikasi, atau kebijakan proxy penting, pakailah client yang perilakunya Anda kendalikan, simpan bytes respons akhir, lalu kirim bytes itu ke extractor. Ini memisahkan kegagalan akuisisi dari kegagalan pemilihan konten dan membuat perbandingan lebih mudah diulang.
Terakhir, ukur properti deployment pada platform target. Instalasi Python 3.14 dengan 17 paket itu tidak membutuhkan browser terpisah, tetapi itu tidak otomatis menjawab throughput, pertumbuhan memori, ketersediaan wheel di semua arsitektur, atau perilaku saat worker berjalan paralel. Artikel ini membuktikan mekanisme precision/retention yang berguna dibanding Readability; kelayakan produksi tetap bergantung pada korpus dan pengujian runtime.
Untuk cek silang eksternal yang bukan pekerjaan basis ini sendiri, halaman evaluasi trafilatura dan ScrapingHub article-extraction-benchmark publik sama-sama menempatkannya di atas readability-lxml pada word-F1 di sekitar ~181 halaman nyata — arah yang sama dengan tabel di atas. Satu catatan yang sering dilewatkan banyak tulisan yang mengutip benchmark itu: F1 trafilatura yang sering disebut (~0,945) melekat pada lini lama 0.5.1, bukan 2.1.0 yang diuji di sini.
Kelebihan dan kekurangan
Kelebihan:
- Kebocoran boilerplate berlabel lebih rendah daripada Readability pada set fixture bersama: 1 blok dari 17 versus 5.
- Mengambil author dan tanggal dengan benar pada fixture lokal, serta title/tanggal/hostname pada kedua halaman artikel nyata.
- HTML yang sama bisa diserialisasikan sebagai teks, Markdown, atau JSON.
- Instalasi 17 paket tanpa runtime browser terpisah.
- Kegagalan berlangsung diam-diam:
fetch_urlmengembalikanNonepada HTTP 500 alih-alih melempar exception. - Versi yang diuji sama dengan rilis terbaru (2.1.0) — tidak ada drift versi.
- Berlisensi Apache-2.0 — permisif dan ramah untuk penggunaan komersial.
Kekurangan:
- Bukan structured scraper: tes katalog mengembalikan 12 nama dan 12 harga sebagai teks dan 0 baris bertipe. Tidak ada schema, tidak ada field.
- Tidak merender JavaScript — hanya HTML statis; butuh renderer terpisah untuk halaman sisi klien.
authordansitenamebernilai null pada dua halaman MediaWiki nyata, jadi ekstraksi byline bukan hal yang dijamin.- Pembersihan yang agresif ada biayanya: ia membuang
<figcaption>yang dipertahankan Readability, dan skornya 0,571 melawan 0,800 Readability pada artikel yang sangat pendek. - Pengembalian
Nonepada 500 yang diam-diam itu butuh 30,012 detik; gunakan fetcher yang dikendalikan pemanggil jika kontrol deadline penting. - Crawler/sitemap bawaan dan format output CSV/XML tidak diuji dalam pembahasan ini, jadi saya tidak membuat klaim tentang keduanya.
Untuk siapa alat ini cocok — dan siapa yang sebaiknya melewatkannya
trafilatura ditujukan untuk ekstraksi konten utama bergaya artikel. Ini kandidat untuk membangun korpus teks, arsip yang mudah dibaca, atau input NLP dari HTML statis ketika pembersihan heuristik bisa diterima. Perbandingan fixture bersama mendukung kebocoran boilerplate yang lebih rendah daripada Readability, sementara Readability mempertahankan lebih banyak kasus pendek dan non-prose.
Lewatkan kalau yang benar-benar Anda butuhkan adalah ekstraksi terstruktur — baris produk dengan harga, record bertipe, field key: value — karena yang diberikan alat ini adalah teks, bukan tabel (tes katalog memulihkan semua 12 nama dan semua 12 harga, serta 0 baris). Lewatkan juga kalau target Anda merender kontennya di browser dan Anda tidak mau menambahkan renderer terpisah, sebab trafilatura membaca HTML statis dan berhenti di situ. Dan pikir dua kali kalau korpus Anda kebanyakan stub pendek, caption gambar, dan halaman berat tabel: pada fixture berlabel, itulah justru tempat pembersihannya memotong konten asli (F1 0,571 pada artikel sangat pendek, <figcaption> dibuang). Cocokkan alat dengan pekerjaannya: teks artikel penuh, ya; JSON terstruktur, halaman JS, atau stub 100 kata, cari yang lain.
Alternatif, termasuk posisi Thunderbit
trafilatura adalah library self-hosted berlisensi Apache-2.0 tanpa biaya vendor per panggilan; komputasi, bandwidth, fetching, monitoring, dan maintenance tetap menjadi biaya operator. Ia menangani ekstraksi bergaya artikel dari HTML yang disediakan, tetapi tidak menjalankan browser atau membentuk schema repeated-row buatan pengguna.
Untuk fixture yang sama di keenam extractor, lihat perbandingan ekstraksi enam library.
Layanan terkelola bisa menaruh akuisisi, rendering, dan pembentukan schema di balik batas vendor. Kami membangun Thunderbit, tetapi tidak menjalankannya terhadap fixture ini, jadi artikel ini tidak mendukung perbandingan kualitas, rendering, latensi, anti-bot, atau biaya. Pilihannya adalah kendali HTML-ke-konten secara self-hosted versus batas akuisisi dan ekstraksi terstruktur yang di-host.
Ulasan benchmark terkait: perbandingan lengkap scraper open source, ulasan Markdown Crawl4AI berbasis browser, dan ulasan Markdown Firecrawl self-hosted.
Coba Thunderbit untuk Ekstraksi Data Web
Putusan
Pertimbangkan trafilatura ketika tugas Anda adalah ekstraksi bergaya artikel dari HTML statis dan prioritas Anda adalah menolak boilerplate berlabel. Pada fixture bersama, ia hanya melewatkan 1 unit boilerplate yang dianotasi, dibanding 5 milik Readability. Keunggulan itu dibayar dengan retensi yang lebih rendah pada fixture sangat pendek dan non-prose, jadi bentuk korpuslah yang harus menentukan pilihan.
Alat ini tidak menjalankan JavaScript dan tidak mengeluarkan baris berulang buatan pengguna. Pada dua halaman MediaWiki, author dan sitename bernilai null, sebuah observasi yang terbatas pada template tersebut. Readability mempertahankan caption yang dibuang trafilatura dan mendapat skor lebih tinggi pada fixture berlabel f3_short_120; bukti yang terlihat mendukung kesimpulan “F1 lebih rendah pada fixture sangat pendek”, bukan hitungan karakter atau klaim bahwa outputnya rusak.
Coba Thunderbit untuk Ekstraksi Data Web Get Started Free
FAQ
Struktur seperti apa yang dikembalikan trafilatura? Ia bisa menyerialisasikan konten hasil ekstraksi dan metadata sebagai JSON, Markdown, teks, HTML, XML, atau CSV. Itu serialisasi yang terstruktur, tetapi bukan schema baris berulang buatan pengguna seperti nama produk, harga, dan rating. Fixture katalog mengembalikan nilai sebagai konten datar, bukan baris bertipe.
Bisakah trafilatura mengubah katalog produk menjadi baris terstruktur? Tidak. Ini content extractor, bukan structured scraper. Pada fixture katalog, ia mengembalikan semua 12 nama produk sebagai teks datar dan 0 baris terstruktur — namanya ada di output, tetapi bukan field. Jika Anda butuh record bertipe seperti nama/harga/rating, gunakan parser berbasis selector atau API ekstraksi berbasis schema.
Apakah trafilatura merender JavaScript? Tidak. Ia hanya memproses HTML statis. Arahkan ke halaman yang dirender klien dan Anda akan mendapatkan apa pun yang dikirim server sebelum JavaScript berjalan, yang sering kali bukan konten yang Anda cari. Pasangkan dengan renderer terpisah jika target Anda berat di JS.
Apakah trafilatura sulit dipasang?
Di virtualenv Python 3.14 yang diuji, instalasi menarik 17 paket dan tidak membutuhkan runtime browser terpisah. Wheel terbesar yang tercatat adalah lxml sebesar 8,6 MB. Secara terpisah, satu panggilan 500 lokal membutuhkan 30,012 detik untuk kembali None; pakailah HTTP client yang dikendalikan pemanggil jika Anda butuh deadline yang terverifikasi.
Apakah trafilatura gratis untuk penggunaan komersial? Ya, lisensinya Apache-2.0, yang permisif dan ramah untuk penggunaan komersial. Seperti biasa, pastikan lisensi terbaru di repo sebelum Anda membangunnya.


