newspaper4k: risultati su 22 fixture controllate su 22

Ultimo aggiornamento il August 17, 2026
newspaper4k: risultati su 22 fixture controllate su 22
Riepilogo AI
In un insieme di fixture annotate e orientate agli articoli, newspaper4k ha prodotto un output su tutte le 22 fixture, ha recuperato il 98,65% delle unità articolo valutate e non ha incluso alcun token di boilerplate etichettato. Queste tre dimensioni lo rendono un candidato molto forte rispetto alle priorità di questo test; non decretano un vincitore assoluto. Nessun altro strumento in questo set ha combinato gli stessi tre risultati osservati. Mozilla Readability ha recuperato tutte le unità di contenuto valutate, ma ha incluso più boilerplate etichettato; goose3 non ha incluso boilerplate etichettato, ma ha restituito stringhe vuote due volte. Con regole decisionali diverse, può risultare preferibile un’altra libreria.

In un set di fixture annotate e orientate agli articoli, newspaper4k ha prodotto un output su tutte le 22 fixture, ha recuperato il 98,65% delle unità articolo valutate e non ha incluso alcun token di boilerplate etichettato. Queste tre dimensioni lo rendono un candidato molto forte rispetto alle priorità di questo test; non decretano però un vincitore assoluto.

Nessun altro strumento in questo set ha messo insieme gli stessi tre risultati osservati. Mozilla Readability ha recuperato tutte le unità di contenuto valutate, ma ha incluso più boilerplate etichettato; goose3 non ha incluso boilerplate etichettato, ma ha restituito stringhe vuote due volte. Con regole decisionali diverse, può risultare preferibile un’altra libreria.

Un’impostazione predefinita del fetching merita attenzione esplicita prima del deploy.

Cos’è newspaper4k

newspaper4k è un fork mantenuto di newspaper3k, a sua volta la continuazione in Python 3 dell’originale newspaper. Questa discendenza conta quando cerchi supporto, perché gran parte di ciò che trovi online fa riferimento al progetto originario e parte della sua API è cambiata.

Riferimento ufficiale: repository ufficiale di newspaper4k.

System diagram: Article Extraction Pipeline

Il modo più comune per usare male questa libreria, per esempio, è provare a chiamare set_html(). Quel metodo non esiste. L’HTML entra tramite download():

from newspaper import Article
a = Article(url="https://example.com/story")
a.download(input_html=html)     # non set_html()
a.parse()
text = a.text

Al primo tentativo ho sbagliato anch’io e ho assegnato alla libreria 0 fixture su 22, prima di verificare se l’errore fosse mio. Lo era.

Quello che restituisce non è solo testo. L’oggetto Article espone campi come text, title, authors, publish_date, top_image, images, movies, meta_description, meta_lang, tags e article_html. keywords e summary richiedono l’installazione opzionale di NLP e la configurazione del corpus descritta più avanti. La superficie dei campi è stata censita, ma l’accuratezza dei metadati non è stata valutata.

Versione testata: 0.9.6, MIT, 1.135 stelle GitHub, con un push nel repository datato 2026-07-31. Questa attività datata è una fotografia, non una valutazione completa dello stato di manutenzione. Python 3.14.2.

Il risultato

LibreriaRecall articolo (tutte le 22)Fuga di boilerplatePrecisione token di contenutoToken contaminantiOutput prodotto
Readability1.00000.23530.91093522/22
trafilatura0.98650.05880.9411422/22
newspaper4k0.98650.00000.9452022/22
resiliparse0.90540.05880.9381722/22
jusText0.83780.47060.87607419/22
goose30.82430.00001.0000020/22

sixway-scores.json. Ogni unità in ogni fixture contiene un token sentinella univoco, quindi “recuperato” e “contaminato” corrispondono a una presenza esatta di sottostringa, non a un punteggio di similarità. Il recall è calcolato su tutte le 22 fixture; fuga e precisione sulle 11 che contengono sia articolo sia boilerplate.

Vale la pena separare tre colonne.

Ha risposto su tutte le pagine. goose3 e jusText non l’hanno fatto — 20 e 19 su 22. Questo conta più di quanto sembri, perché precisione e F1 in una tabella come questa sono condizionati dalla produzione di output: una libreria che restituisce una stringa vuota non contribuisce a nessuno dei due lati del rapporto, quindi il non rispondere è gratis. La precisione di 1.0000 di goose3 è stata valutata su 10 fixture su 11; quella di newspaper4k, 0.9452, su 11 su 11. Non è esattamente la stessa misura.

Non ha infiltrato nulla. Le fixture includono boilerplate deliberatamente avversari — blocchi promozionali con classe neutra accanto all’articolo, thread di commenti con classi innocue, blocchi pubblicitari che non dicono “ad”. La regola di Readability basata sull’appendice dei sibling ne ha inglobati diversi; newspaper4k non ne ha preso nessuno.

Ha mancato una sola unità su 74, e quella mancata è condivisa.

La mancata è nella fixture non in prosa — una pagina costruita con tabelle, un blocco di codice, elementi brevi e una didascalia immagine invece di paragrafi — e l’unità saltata è la didascalia. Non è l’unico a comportarsi così:

LibreriaRecall sulla pagina non in prosaUnità perse
Readability1.000
jusText1.000
trafilatura0.875la didascalia
resiliparse0.875la didascalia
newspaper4k0.875la didascalia
goose30.250entrambe le tabelle, il blocco di codice, entrambi gli elementi brevi, la didascalia

Tre librerie perdono la stessa didascalia e nessun’altra unità: sembra meno tre bug distinti e più un’assunzione ereditaria condivisa su quanto valga una caption. Se i tuoi contenuti sono documentazione, ricette o qualunque cosa in cui la didascalia contenga informazioni che il paragrafo non contiene, vale la pena testarlo prima di adottarlo — e Readability e jusText l’hanno conservata.

La stessa fixture è il punto in cui goose3 crolla del tutto, perdendo tre quarti della pagina, quindi il “contenuto non in prosa” è un asse su cui queste sei librerie divergono molto più di quanto suggerisca la tabella principale.

In termini di velocità, la mediana di estrazione di newspaper4k sulle 22 fixture è stata 2,69 ms, la più lenta delle sei, con un caso peggiore di 199,81 ms. Rispetto alla mediana di 0,06 ms di resiliparse, in questa esecuzione controllata c’è un divario di 45×. La mediana può essere piccola in un flusso su una singola pagina, ma non sono stati testati throughput e latenza di coda sotto carico. Il cold import è misurato separatamente più avanti.

La default che cambierei alla prima riga

System diagram: The default I would change on line one

Riferimento ufficiale: documentazione di newspaper4k.

Leggendo l’oggetto Configuration fornito dal pacchetto emergono ventidue impostazioni. Una di queste è la seguente:

System diagram: Separate Fetching From Extraction

_honor_robotstxt = False

newspaper4k non rispetta robots.txt a meno che tu non glielo dica esplicitamente. Se gli lasci fare il fetch — Article(url).download() senza input_html — recupererà qualunque URL gli passi, indipendentemente da ciò che dice il file robots del sito.

È una scelta ingegneristica difendibile per una libreria il cui uso principale è parsare HTML che hai già in mano, ma è una scelta molto poco difendibile da scoprire in produzione dopo averla puntata contro mille URL. Imposta honor_robotstxt=True nel tuo Configuration, oppure passa input_html ed esegui tu il fetch, come ho fatto in tutto questo test.

Altre due impostazioni da conoscere:

number_threads = 10. Il parallelismo predefinito per gli helper multi-articolo è dieci. La concorrenza non equivale a richieste al secondo, ma può generare raffiche di richieste simultanee se non imposti limiti espliciti per host e scheduling.

fetch_images = True. Il fetch delle immagini è attivo di default, quindi si pone anche la questione dell’uso offline. Con socket.connect bloccato, il percorso testato di newspaper4k 0.9.6 — download(input_html=…) seguito da parse() su un input HTML già in memoria — si è completato, ha restituito 1.292 caratteri e ha tentato zero connessioni di rete. Questo supporta quel percorso specifico, non ogni configurazione, plugin, tipo di contenuto o futura release.

Le altre impostazioni sono ragionevoli: 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.

La realtà dell’installazione

pip install newspaper4k scarica 22 pacchetti e 47,5 MiB in circa sei secondi. Cold import in un subprocess nuovo: 2,812 s — il più lento del confronto.

LibreriaPacchettisite-packagesCold importExtraction p50
resiliparse521.0 MiB0.015 s0.06 ms
jusText322.4 MiB0.777 s0.56 ms
goose31644.3 MiB2.181 s1.85 ms
newspaper4k2247.5 MiB2.812 s2.69 ms
trafilatura1769.9 MiB1.584 s0.51 ms

install-and-import.json. Ogni libreria è in un virtualenv vuoto separato, così nulla eredita le dipendenze di un’altra.

2,812 secondi per l’import significano 187 volte i 15 millisecondi di resiliparse. In un worker a lunga esecuzione lo paghi una volta sola e diventa irrilevante. In una funzione serverless lo paghi a ogni cold start, e in quel caso newspaper4k è la scelta sbagliata a prescindere dalla bontà dell’estrazione.

Un piccolo spigolo sull’installazione. All’import compare un avviso:

UserWarning: nltk is not installed. Some NLP features will be unavailable. Install it with: pip install 'newspaper4k[nlp]'

In questo test non servivano quelle funzioni e l’estrazione ha funzionato bene anche senza, ma l’installazione base non è quella completa, e newspaper4k[nlp] introduce un albero di dipendenze molto più pesante oltre ai download dei corpora. Mettilo a budget solo se ti servono davvero keyword e riassunti.

Memoria e cosa fa l’HTML rotto

Due aspetti che ogni review di questo gruppo indicava come non testati, ora misurati.

Il contesto più ampio del test di stress è nel confronto tra memoria e HTML malformato di dieci librerie.

Memoria residente massima, tramite /usr/bin/time -l, un processo nuovo per ogni cella — il floor di import è il costo della libreria caricata e inattiva, i picchi includono il documento.

LibreriaRuntimeImport floor (MiB)Picco su HTML da 226 KB (MiB)Picco su HTML da 10 MB (MiB)
html2textpython3.1418.719.971.2
pyquerypython3.1430.333.9172.5
resiliparsepython3.1420.525.1225.1
markdownifypython3.1423.928.9278.5
goose3python3.1444.152.4398.5
cheerionode2266.876.5398.5
justextpython3.1430.336.6431.2
newspaper4kpython3.1452.661.8668.5
trafilaturapython3.1452.564.8927.1
turndownnode2247.868.42947.1

memory-results.json. I baseline di Python e Node non sono confrontabili tra loro; l’interprete è presente in entrambi.

Il floor di newspaper4k è 52,6 MiB e il picco su 10 MB è 668,5 MiB — secondo più pesante tra le librerie Python. Nessuno dei due valori è un problema per pagine ordinarie; entrambi contano se stai elaborando in batch documenti grandi su un worker con memoria limitata.

HTML rotto. Dodici documenti che rompono esattamente una cosa ciascuno — tag non chiusi, elementi inline annidati male, attributi senza virgolette con spazi, chiusure fuori posto, assenza totale di <html>, attributi duplicati, un documento troncato a metà tag, entità errate, uno <script> non chiuso, una dichiarazione di charset fuorviante, un commento che contiene markup e 600 livelli di annidamento — più due controlli ben formati di dimensione corrispondente, perché “non ha restituito nulla” dice qualcosa sulla malformazione solo se la libreria non tace anche su un documento pulito della stessa dimensione.

I controlli e i casi malformati si separano chiaramente nei risultati grezzi:

GruppoDocumentiEccezioniOutput vuotoSentinelle valutate recuperate
Controlli ben formati e di dimensione corrispondente200non usate nel punteggio dei malformati
Fixture malformate120105/33, escluso il caso con <script> non chiuso

I due controlli hanno prodotto 70 e 1.351 caratteri, mentre dieci dei dodici input malformati hanno prodotto una stringa vuota. Questo rende il silenzio attribuibile alla malformazione, in questo disegno di fixture, e non semplicemente alla brevità dell’input. Lo scorer controlla le sentinelle di heading, paragrafo e link nei undici documenti malformati eleggibili. La fixture con unclosed-<script> è esclusa perché, con il parsing HTML5, il markup successivo resta contenuto dello script. Vedi malformed-results.json. Questo è un limite di recupero importante da tenere in conto nella scelta, non un semplice successo del tipo “non ha sollevato eccezioni”.

Pro e contro

A favore. Nessun token di boilerplate etichettato in questo confronto, output su tutte le 22 fixture articolo controllate e 0,9865 di recall articolo valutato. Espone testo articolo più campi metadati, anche se l’accuratezza dei metadati non è stata testata. Il percorso testato con HTML già in memoria non ha tentato connessioni di rete con socket.connect bloccato. Il repository aveva un push datato recente al momento del controllo; lo stato di manutenzione più generale non è stato valutato.

Contro. Il cold import più pesante del set, con 2,812 s e 22 pacchetti / 47,5 MiB di site-packages misurati. honor_robotstxt ha come default False e gli helper multi-articolo usano dieci thread di default. L’installazione base avvisa dell’assenza di NLTK, quindi keyword e riassunti richiedono un’installazione opzionale più pesante. Soprattutto, dieci delle dodici fixture malformate hanno restituito output vuoto, nonostante entrambi i controlli ben formati e corrispondenti producessero testo.

Chi dovrebbe usarlo e chi no

Valuta newspaper4k se la tua priorità è: produrre testo non vuoto sul corpus controllato orientato agli articoli, minimizzare il boilerplate etichettato in quel corpus e accettare un cold import più lento. Con questa regola esplicita, è risultato in testa in questo confronto tra fixture. Con una regola diversa, Readability può essere preferibile per massimizzare il contenuto recuperato, oppure resiliparse per startup ed estrazione mediana più veloci.

Evitalo o testalo con molta attenzione quando il cold start è il vincolo principale, quando 47,5 MiB di site-packages misurati sono un fattore rilevante, o quando conta il recupero da HTML malformato. In questo confronto resiliparse ha importato 187× più velocemente, ma non ha pareggiato trafilatura su tutte le colonne di qualità: trafilatura aveva un recall articolo più alto, mentre i profili di fuga e precisione differivano anch’essi. newspaper4k è orientato agli articoli; le pagine prodotto e le dashboard non sono state testate, quindi non se ne può affermare alcun comportamento.

Qualunque cosa tu faccia, imposta honor_robotstxt se gli lasci fare il fetch. Non è una nota sulle prestazioni.

Dove entra in gioco un’API gestita

newspaper4k può parsare HTML fornito dal chiamante e dispone anche di percorsi di fetching. Un servizio gestito di estrazione porta acquisizione, rendering e lavoro sullo schema dietro il perimetro di un vendor. Noi costruiamo Thunderbit, ma non è stato eseguito su questo set di fixture, quindi questa review non supporta alcun confronto su qualità, rendering, anti-bot, latenza o costi. Per HTML di articolo già in mano, l’evidenza qui riguarda solo newspaper4k; i target non article-oriented richiedono una valutazione propria.

Per lo stesso set di fixture attraverso tutti e sei gli extractor, vedi il confronto tra sei librerie di estrazione.

Per il campo hosted, la nostra rassegna delle API di web scraping offre una vista più ampia; per alternative self-hosted, il pilastro sugli scraper open source. Se il testo finirà in un modello, convertire HTML in Markdown in Python mostra dove si perde fedeltà.

Prova Thunderbit per l’estrazione di dati web

Dovresti usare newspaper4k?

Considera newspaper4k un ottimo candidato per l’estrazione di testo da articoli quando hai già l’HTML disponibile, poi esegui un confronto su siti reali con il tuo corpus prima di adottarlo. Il set controllato supporta un recall articolo elevato, nessun boilerplate etichettato e output non vuoto su tutte le 22 fixture orientate agli articoli. Non copre pagine reali né l’accuratezza dei metadati, e dieci delle dodici fixture malformate hanno restituito output vuoto.

Se usi il percorso di fetching, rivedi esplicitamente honor_robotstxt=False, il parallelismo a dieci thread e i limiti per host. Se il cold start o il footprint delle dipendenze contano, misura nel tuo deployment i 2,812 secondi di import locale e i 47,5 MiB di site-packages osservati, invece di considerarli costi universali del container.

Prova Thunderbit per l’estrazione di dati web Get Started Free

FAQ

Perché set_html() non funziona?
Perché in newspaper4k non esiste. L’HTML entra tramite download(input_html=html), poi parse(). I risultati di ricerca possono mostrare esempi di newspaper3k, quindi è un errore facile; l’ho commesso anch’io al primo giro e ho corretto l’harness prima di fare lo scoring.

newspaper4k rispetta robots.txt?
Non per impostazione predefinita. honor_robotstxt viene fornito come False. Impostalo su True nel tuo Configuration se lasci che la libreria faccia il fetch, oppure passa input_html ed esegui tu il fetch. Anche il lavoro multi-articolo usa dieci thread di default. Si tratta di parallelismo non scelto, non di un rate di richieste fisso; imposta limiti espliciti per host quando effettui il fetch.

parse() fa richieste di rete?
Su newspaper4k 0.9.6, il percorso testato download(input_html=…) + parse() non ha effettuato alcun tentativo di connessione per un input HTML già in memoria mentre socket.connect era bloccato. Questo non dimostra che ogni configurazione del parser, plugin, tipo di contenuto o release futura sia priva di rete.

Qual è l’avviso NLTK all’import?
L’installazione base non include NLTK, quindi l’estrazione di keyword e i riassunti non sono disponibili e la libreria lo segnala all’import. L’estrazione in sé non ne risente — tutto ciò che è stato misurato qui ha usato l’installazione base. pip install 'newspaper4k[nlp]' aggiunge queste funzioni insieme a un albero di dipendenze più pesante e ai download dei corpora.

Cosa non ha testato questa review?
Le pagine reali: queste sono fixture controllate con unità etichettate. I campi di metadati sono stati censiti ma non valutati per accuratezza di titolo, autore, data o immagini. Non sono stati testati nemmeno l’estrazione multilingua, gli extra NLP, il crawling multi-thread delle sorgenti e il throughput sotto carico. La memoria di picco del processo è stata misurata su un input HTML da 226 KB e uno da 10 MB, non in concorrenza né sotto carico sostenuto.

Ke
Ke
CTO di Thunderbit | Senior Data Scientist ed esperto di ML Con quasi un decennio di esperienza nel machine learning e nella data science, Ke Shen è un ex studente della Columbia University ed ex Senior Data Scientist presso Walmart Labs. Grazie a una profonda competenza, riconosciuta dai suoi pari, in Python, R, Java e statistica, condivide insight collaudati sul passaggio di algoritmi AI complessi dalla teoria a un'architettura pronta per la produzione.
Indice
Thunderbit · Agente AI per dati web

Estrai dati da qualsiasi pagina in 1 clic

Scelto da oltre 250.000 utenti
piano gratuito disponibile
Dalla pagina web al foglio di calcolo
Descrivi ciò che ti serve — l'agente AI di Thunderbit lo estrae ed esporta in Excel, Google Sheets, Airtable o Notion. Puoi iniziare gratis.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week