Dalam satu set fixture beranotasi yang berfokus pada artikel, newspaper4k menghasilkan output pada seluruh 22 fixture, memulihkan 98,65% unit artikel yang diberi skor, dan tidak menyertakan token boilerplate berlabel apa pun. Tiga dimensi ini membuatnya jadi kandidat yang kuat menurut prioritas pengujian ini; tapi tentu saja, itu belum otomatis menjadikannya pemenang universal.
Tidak ada alat lain di set ini yang menggabungkan ketiga hasil observasi tersebut. Mozilla Readability memulihkan semua unit konten yang diberi skor, tetapi ikut membawa lebih banyak boilerplate berlabel; goose3 tidak menyertakan boilerplate berlabel, tetapi dua kali mengembalikan string kosong. Aturan keputusan yang berbeda bisa saja memilih pustaka lain.
Ada satu perilaku default saat fetching yang layak kamu perhatikan secara khusus sebelum deployment.
Apa itu newspaper4k
newspaper4k adalah fork yang masih aktif dipelihara dari newspaper3k, yang sebelumnya merupakan kelanjutan newspaper versi Python 3. Rantai keturunan ini penting saat kamu mencari bantuan, karena sebagian besar referensi online masih merujuk ke pendahulunya dan sebagian API-nya sudah berpindah.
Referensi resmi: repositori resmi newspaper4k.

Cara paling umum salah pakai library ini, misalnya, adalah mencoba set_html(). Metode itu memang tidak ada. HTML dimasukkan lewat download():
from newspaper import Article
a = Article(url="https://example.com/story")
a.download(input_html=html) # bukan set_html()
a.parse()
text = a.text
Saya sendiri sempat salah di percobaan pertama dan memberi skor 0 dari 22 fixture sebelum mengecek apakah yang keliru itu saya sendiri. Ternyata memang saya yang salah.
Yang kamu dapatkan bukan cuma teks. Objek Article menyediakan field seperti text, title, authors, publish_date, top_image, images, movies, meta_description, meta_lang, tags, dan article_html. keywords dan summary butuh instalasi NLP opsional serta setup corpus yang dijelaskan di bawah. Permukaan field sudah diinventarisasi, tapi akurasi metadata tidak dinilai.
Versi yang diuji: 0.9.6, MIT, 1.135 bintang GitHub, dengan push repositori bertanggal 2026-07-31. Aktivitas bertanggal ini hanya snapshot, bukan penilaian penuh atas kesehatan pemeliharaan. Python 3.14.2.
Hasilnya
| Library | Recall artikel (semua 22) | Kebocoran boilerplate | Presisi token konten | Token pengotor | Menghasilkan output |
|---|---|---|---|---|---|
| Readability | 1.0000 | 0.2353 | 0.9109 | 35 | 22/22 |
| trafilatura | 0.9865 | 0.0588 | 0.9411 | 4 | 22/22 |
| newspaper4k | 0.9865 | 0.0000 | 0.9452 | 0 | 22/22 |
| resiliparse | 0.9054 | 0.0588 | 0.9381 | 7 | 22/22 |
| jusText | 0.8378 | 0.4706 | 0.8760 | 74 | 19/22 |
| goose3 | 0.8243 | 0.0000 | 1.0000 | 0 | 20/22 |
sixway-scores.json. Setiap unit di setiap fixture punya token sentinel unik, jadi “recovered” dan “leaked” adalah kecocokan substring persis, bukan skor kemiripan. Recall dihitung atas semua 22 fixture; leak dan precision dihitung atas 11 fixture yang memuat artikel sekaligus boilerplate.
Ada tiga kolom yang perlu dipisahkan.
Dia menjawab setiap halaman. goose3 dan jusText tidak — masing-masing hanya 20 dan 19 dari 22. Ini lebih penting daripada kelihatannya, karena precision dan F1 dalam tabel seperti ini bersyarat pada adanya output: library yang mengembalikan string kosong tidak menyumbang apa pun ke salah satu sisi rasio, jadi tidak mengeluarkan output terasa “gratis”. Precision 1.0000 milik goose3 dihitung pada 10 dari 11 fixture; 0.9452 milik newspaper4k dihitung pada 11 dari 11. Itu bukan metrik yang benar-benar setara.
Dia tidak membocorkan apa pun. Fixture ini berisi boilerplate yang sengaja dibuat adversarial — blok promo dengan kelas netral yang berdampingan dengan artikel, thread komentar dengan nama kelas yang tampak aman, blok iklan yang tidak menyebut “ad”. Heuristik sibling-append milik Readability menelan sebagian di antaranya; newspaper4k tidak menelan satu pun.
Dia melewatkan satu unit dari 74, dan unit yang terlewat itu juga terlewat di tempat lain.
Kekurangannya ada pada fixture non-prosa — halaman yang dibangun dari tabel, blok kode, item pendek, dan caption gambar, bukan paragraf — dan unit yang dijatuhkan adalah caption. Ia tidak sendirian di situ:
| Library | Recall pada halaman non-prosa | Unit yang terlewat |
|---|---|---|
| Readability | 1.000 | — |
| jusText | 1.000 | — |
| trafilatura | 0.875 | caption |
| resiliparse | 0.875 | caption |
| newspaper4k | 0.875 | caption |
| goose3 | 0.250 | kedua tabel, blok kode, kedua item pendek, caption |
Tiga library menjatuhkan caption yang sama dan tidak ada unit lain, yang lebih terlihat seperti asumsi warisan bersama tentang nilai sebuah caption daripada tiga bug terpisah. Kalau kontenmu berupa dokumentasi, resep, atau apa pun di mana caption membawa informasi yang tidak ada di paragraf, itu layak diuji dulu sebelum kamu berkomitmen — dan Readability serta jusText sama-sama mempertahankannya.
Fixture yang sama juga jadi tempat goose3 benar-benar ambruk, kehilangan tiga perempat halaman, jadi “konten non-prosa” adalah sumbu pembeda keenam library ini yang jauh lebih besar daripada yang disiratkan tabel utama.
Dari sisi kecepatan, median ekstraksi newspaper4k di 22 fixture adalah 2,69 ms, paling lambat di antara keenamnya, dengan kasus terburuk 199,81 ms. Dibandingkan median resiliparse 0,06 ms, selisihnya 45Ă— dalam pengujian terkontrol ini. Median mungkin kecil untuk alur kerja satu halaman, tetapi throughput dan tail latency saat beban tinggi tidak diuji. Waktu cold import diukur terpisah di bawah.
Default yang akan saya ubah di baris pertama

Referensi resmi: dokumentasi newspaper4k.
Saat menelusuri objek Configuration bawaan, ada dua puluh dua pengaturan. Salah satunya adalah ini:

_honor_robotstxt = False
newspaper4k tidak mematuhi robots.txt kecuali kamu memintanya. Kalau library ini dibiarkan melakukan fetch — Article(url).download() tanpa input_html — ia akan mengambil apa pun yang kamu arahkan, terlepas dari isi file robots situs tersebut.
Itu bisa dipahami sebagai default rekayasa yang masuk akal untuk library yang penggunaan utamanya memang mem-parsing HTML yang sudah kamu pegang, tetapi jadi sangat berisiko kalau baru ketahuan di produksi setelah kamu mengarahkannya ke seribu URL. Set honor_robotstxt=True pada Configuration kamu, atau kirim input_html dan lakukan fetching sendiri — itulah yang saya lakukan sepanjang pengujian ini.
Dua hal lain yang perlu diketahui:
number_threads = 10. Paralelisme bawaan untuk helper multi-artikel adalah sepuluh. Concurrency bukan berarti request per detik, tapi bisa memicu lonjakan permintaan bersamaan kalau kamu tidak menetapkan batas per-host dan penjadwalan secara eksplisit.
fetch_images = True. Pengambilan gambar aktif secara default, yang memunculkan pertanyaan soal penggunaan offline. Dengan socket.connect diblokir, alur newspaper4k 0.9.6 yang diuji — download(input_html=…) lalu parse() pada satu input HTML yang ditahan — selesai, mengembalikan 1.292 karakter, dan mencoba nol koneksi jaringan. Ini mendukung jalur persis tersebut, bukan semua konfigurasi, plugin, tipe konten, atau rilis mendatang.
Sisanya cukup masuk akal: min_word_count 300, min_sent_count 7, max_text 100.000, http_success_only True, memorize_articles True, follow_meta_refresh False, allow_binary_content False.
Realitas setup
pip install newspaper4k menarik 22 paket dan 47,5 MiB dalam kira-kira enam detik. Cold import dalam subprocess baru: 2,812 dtk — yang paling lambat dalam perbandingan.
| Library | Paket | site-packages | Cold import | Extraction p50 |
|---|---|---|---|---|
| resiliparse | 5 | 21.0 MiB | 0.015 s | 0.06 ms |
| jusText | 3 | 22.4 MiB | 0.777 s | 0.56 ms |
| goose3 | 16 | 44.3 MiB | 2.181 s | 1.85 ms |
| newspaper4k | 22 | 47.5 MiB | 2.812 s | 2.69 ms |
| trafilatura | 17 | 69.9 MiB | 1.584 s | 0.51 ms |
install-and-import.json. Masing-masing library berada di virtualenv kosong tersendiri, jadi tidak ada yang mewarisi dependensi tetangganya.
2,812 detik untuk import adalah 187 kali lebih lambat daripada 15 milidetik milik resiliparse. Dalam worker yang berjalan lama, biaya ini dibayar sekali dan jadi tidak relevan. Dalam fungsi serverless, biaya ini dibayar setiap cold start, dan di situlah newspaper4k menjadi pilihan yang salah terlepas dari seberapa bagus ekstraksinya.
Ada satu sisi kasar saat instalasi. Import menampilkan peringatan:
UserWarning: nltk is not installed. Some NLP features will be unavailable. Install it with: pip install 'newspaper4k[nlp]'
Tidak ada satu pun pengujian ini yang membutuhkan fitur tersebut dan ekstraksi tetap berjalan dengan baik tanpanya, tetapi instalasi dasar bukan instalasi lengkap, dan newspaper4k[nlp] membawa tree dependensi yang jauh lebih berat beserta unduhan corpus. Siapkan anggaran hanya kalau kamu memang membutuhkan keywords dan summary.
Memori, dan apa yang dilakukan HTML rusak terhadapnya
Dua hal yang oleh setiap review di batch ini dicatat sebagai belum diuji, kini sudah diukur.
Konteks stress test yang lebih luas ada di perbandingan memori dan HTML rusak untuk sepuluh library.
Puncak resident memory, via /usr/bin/time -l, satu proses baru per sel — floor import adalah biaya yang dibutuhkan library saat dimuat dan menganggur, sedangkan puncaknya mencakup dokumen.
| Library | Runtime | Import floor (MiB) | Puncak HTML 226 KB (MiB) | Puncak HTML 10 MB (MiB) |
|---|---|---|---|---|
| html2text | python3.14 | 18.7 | 19.9 | 71.2 |
| pyquery | python3.14 | 30.3 | 33.9 | 172.5 |
| resiliparse | python3.14 | 20.5 | 25.1 | 225.1 |
| markdownify | python3.14 | 23.9 | 28.9 | 278.5 |
| goose3 | python3.14 | 44.1 | 52.4 | 398.5 |
| cheerio | node22 | 66.8 | 76.5 | 398.5 |
| justext | python3.14 | 30.3 | 36.6 | 431.2 |
| newspaper4k | python3.14 | 52.6 | 61.8 | 668.5 |
| trafilatura | python3.14 | 52.5 | 64.8 | 927.1 |
| turndown | node22 | 47.8 | 68.4 | 2947.1 |
memory-results.json. Baseline Python dan Node tidak bisa dibandingkan langsung satu sama lain; interpreter ada di dalam keduanya.
Floor newspaper4k adalah 52,6 MiB dan puncak pada HTML 10 MB adalah 668,5 MiB — kedua-terberat di antara library Python. Dua angka ini bukan masalah untuk halaman biasa; tapi keduanya jadi penting kalau kamu memproses dokumen besar secara batch di worker dengan batas memori.
HTML rusak. Dua belas dokumen yang masing-masing merusak tepat satu hal — tag yang tidak ditutup, inline element yang susunannya salah, atribut tanpa tanda kutip yang berisi spasi, penutup tag nyasar, tidak ada <html> sama sekali, atribut duplikat, dokumen yang terpotong di tengah tag, entitas yang salah, <script> yang tidak ditutup, deklarasi charset yang menyesatkan, komentar yang berisi markup, dan 600 level nesting — plus dua kontrol well-formed dengan ukuran yang cocok, karena “library ini tidak mengembalikan apa pun” hanya bermakna soal malformedness kalau library itu juga diam pada dokumen bersih dengan ukuran yang sama.
Kontrol dan kasus malformed dipisahkan dengan jelas dalam hasil mentah:
| Grup | Dokumen | Memunculkan error | Output kosong | Sentinel skor yang dipulihkan |
|---|---|---|---|---|
| Kontrol well-formed dengan ukuran cocok | 2 | 0 | 0 | tidak digunakan dalam skor malformed |
| Fixture malformed | 12 | 0 | 10 | 5/33, tidak termasuk kasus <script> yang tidak ditutup |
Dua kontrol menghasilkan 70 dan 1.351 karakter, sementara sepuluh dari dua belas input malformed menghasilkan string kosong. Itu membuat keheningan output bisa diatribusikan ke malformedness dalam desain fixture ini, bukan sekadar karena inputnya pendek. Penilai memeriksa sentinel heading, paragraf, dan tautan di sebelas dokumen malformed yang memenuhi syarat. Fixture <script> yang tidak ditutup dikecualikan karena, menurut parsing HTML5, markup sesudahnya tetap jadi konten script. Lihat malformed-results.json. Ini adalah batas pemulihan yang penting untuk dibawa ke tahap seleksi, bukan sekadar keberhasilan “tidak melempar error”.
Kelebihan dan kekurangan
Kelebihan. Tidak ada token boilerplate berlabel dalam perbandingan ini, output pada semua 22 fixture artikel terkendali, dan recall artikel terskor 0,9865. Ia menampilkan teks artikel plus field metadata, meski akurasi metadata tidak diuji. Jalur held-HTML yang diuji tidak melakukan upaya jaringan saat socket.connect diblokir. Repositori memiliki push bertanggal terbaru saat diperiksa; kesehatan pemeliharaan yang lebih luas tidak dievaluasi.
Kekurangan. Cold import paling berat di set ini, 2,812 dtk dan 22 paket / 47,5 MiB site-packages terukur. honor_robotstxt default-nya False, dan helper multi-artikel default ke sepuluh thread. Instalasi dasar memperingatkan bahwa NLTK tidak ada, jadi keywords dan summary memerlukan instalasi opsional yang lebih berat. Yang paling penting, sepuluh dari dua belas fixture malformed mengembalikan output kosong meskipun kedua kontrol well-formed yang cocok menghasilkan teks.
Siapa yang sebaiknya memakai ini, dan siapa yang sebaiknya tidak
Pertimbangkan newspaper4k jika urutan prioritasmu adalah: menghasilkan teks non-kosong pada korpus artikel terkendali, meminimalkan boilerplate berlabel pada korpus itu, dan menerima cold import yang lebih lambat. Dengan aturan eksplisit seperti itu, ia memimpin perbandingan fixture ini. Aturan yang berbeda bisa saja memilih Readability untuk retensi konten terskor maksimal atau resiliparse untuk startup dan kecepatan ekstraksi median.
Lewati atau uji dengan sangat hati-hati kalau cold start mendominasi, kalau 47,5 MiB site-packages yang terukur itu terasa signifikan, atau kalau pemulihan dari HTML rusak penting. Resiliparse di sini melakukan import 187Ă— lebih cepat, tetapi ia tidak menyamai trafilatura pada semua kolom kualitas: trafilatura punya recall artikel lebih tinggi, sementara profil kebocoran dan presisinya juga berbeda. newspaper4k berorientasi pada artikel; listing produk dan dashboard tidak diuji, jadi tidak ada klaim perilaku untuk dua jenis konten itu.
Apa pun yang kamu lakukan, set honor_robotstxt kalau kamu membiarkannya melakukan fetch. Itu bukan catatan performa.
Di mana API terkelola masuk
newspaper4k bisa mem-parsing HTML yang diberikan caller dan juga punya jalur fetching. Layanan ekstraksi terkelola menempatkan akuisisi, rendering, dan pekerjaan skema di balik batas vendor. Kami membangun Thunderbit, tetapi Thunderbit tidak dijalankan pada set fixture ini, jadi ulasan ini tidak mendukung perbandingan kualitas, rendering, anti-bot, latensi, atau biaya apa pun. Untuk HTML artikel yang ditahan, bukti di sini hanya tentang newspaper4k; target non-artikel perlu evaluasi sendiri.
Untuk fixture yang sama di keenam extractor, lihat perbandingan ekstraksi enam library.
Untuk ranah hosted, ringkasan web scraping API memberi pandangan yang lebih luas; untuk alternatif self-hosted, lihat pillar open-source scraper. Kalau teks akan masuk ke model, mengonversi HTML ke Markdown di Python membahas di mana fidelitas hilang.
Coba Thunderbit untuk Ekstraksi Data Web
Haruskah Anda menggunakan newspaper4k?
Perlakukan newspaper4k sebagai kandidat kuat untuk ekstraksi teks artikel ketika HTML sudah tersedia, lalu lakukan bake-off nyata di korpusmu sebelum mengadopsinya. Set terkendali ini mendukung recall artikel terskor yang tinggi, tanpa boilerplate berlabel, dan output non-kosong pada semua 22 fixture berorientasi artikel. Namun, set ini tidak mencakup halaman nyata atau akurasi metadata, dan sepuluh dari dua belas fixture malformed mengembalikan output kosong.
Kalau kamu memakai jalur fetching-nya, tinjau secara eksplisit honor_robotstxt=False, paralelisme sepuluh thread, dan kontrol rate per host. Kalau cold start atau footprint dependensi penting, ukur observasi import lokal 2,812 detik dan site-packages 47,5 MiB di deploymentmu sendiri, bukan menganggapnya sebagai biaya container universal.
Coba Thunderbit untuk Ekstraksi Data Web Get Started Free
FAQ
Mengapa set_html() tidak berfungsi?
Karena metode itu memang tidak ada di newspaper4k. HTML masuk lewat download(input_html=html), lalu parse(). Hasil pencarian bisa menampilkan contoh newspaper3k, jadi ini gampang banget bikin orang salah langkah; saya sendiri melakukannya di percobaan pertama dan memperbaiki harness sebelum memberi skor.
Apakah newspaper4k mematuhi robots.txt?
Tidak secara default. honor_robotstxt dikirim sebagai False. Set ke True pada Configuration kalau kamu membiarkan library melakukan fetch, atau kirim input_html dan fetch sendiri. Pekerjaan multi-artikel juga default ke sepuluh thread. Itu paralelisme yang tidak dipilih, bukan rate request yang tetap; tetapkan batas per-host secara eksplisit untuk fetching.
Apakah parse() melakukan request jaringan?
Pada newspaper4k 0.9.6, jalur download(input_html=…) lalu parse() yang diuji tidak melakukan percobaan koneksi apa pun untuk satu input HTML yang ditahan saat socket.connect diblokir. Itu tidak membuktikan bahwa semua konfigurasi parser, plugin, tipe konten, atau rilis mendatang bebas jaringan.
Apa arti peringatan NLTK saat import?
Instalasi dasar tidak menyertakan NLTK, jadi ekstraksi keyword dan summarization tidak tersedia dan library menyatakannya saat import. Ekstraksi sendiri tidak terpengaruh — semua yang diukur di sini berjalan pada instalasi dasar. pip install 'newspaper4k[nlp]' menambahkannya bersama tree dependensi yang lebih berat dan unduhan corpus.
Apa yang tidak diuji dalam review ini? Halaman dunia nyata — ini adalah fixture terkendali dengan unit berlabel. Field metadata sudah diinventarisasi tetapi tidak dinilai untuk akurasi title, author, date, atau image. Ekstraksi multibahasa, tambahan NLP, crawling sumber multi-thread, dan throughput di bawah beban juga tidak diuji. Puncak memori proses diukur pada satu input HTML 226 KB dan satu input 10 MB, bukan dalam kondisi concurrency atau beban berkelanjutan.


