W jednym oznaczonym zestawie próbek nastawionym na artykuły, newspaper4k wygenerował wynik dla wszystkich 22 próbek, odzyskał 98,65% ocenianych jednostek treści artykułu i nie zawierał żadnych oznaczonych tokenów boilerplate. Te trzy cechy czynią go mocnym kandydatem w ramach priorytetów tego testu; nie przesądzają jednak o uniwersalnym zwycięzcy.
Żadne inne narzędzie w tym zestawie nie połączyło tych trzech zaobserwowanych wyników. Mozilla Readability odzyskał każdą ocenianą jednostkę treści, ale zawierał więcej oznaczonego boilerplate; goose3 nie zawierał oznaczonego boilerplate, lecz dwa razy zwrócił puste ciągi. Inne kryteria wyboru mogą preferować inną bibliotekę.
Jedna domyślna opcja pobierania zasługuje na wyraźne omówienie przed wdrożeniem.
Czym jest newspaper4k
newspaper4k to utrzymywana odnoga newspaper3k, a ta z kolei była kontynuacją oryginalnego newspaper dla Pythona 3. Ten rodowód ma znaczenie, gdy szukasz pomocy, ponieważ większość materiałów w sieci odnosi się do starszego projektu, a część jego API została przeniesiona lub zmieniona.
Oficjalne źródło: oficjalne repozytorium newspaper4k.

Najczęstszym błędem przy korzystaniu z tej biblioteki jest sięgnięcie po set_html(). Taka metoda nie istnieje. HTML trafia do biblioteki przez download():
from newspaper import Article
a = Article(url="https://example.com/story")
a.download(input_html=html) # nie set_html()
a.parse()
text = a.text
Za pierwszym razem też zrobiłem to źle i przyznałem bibliotece 0 z 22 próbek, zanim sprawdziłem, czy błąd nie leżał po mojej stronie. I rzeczywiście — leżał.
Zwrot, który dostajesz, to nie tylko tekst. Obiekt Article udostępnia pola takie jak text, title, authors, publish_date, top_image, images, movies, meta_description, meta_lang, tags i article_html. keywords oraz summary wymagają opcjonalnej instalacji NLP i konfiguracji korpusu opisanej niżej. Zakres pól został zinwentaryzowany, ale dokładność metadanych nie była oceniana.
Testowana wersja: 0.9.6, MIT, 1 135 gwiazdek GitHub, z datą ostatniego pushu w repozytorium 2026-07-31. Taka data aktywności jest tylko migawką, a nie pełną oceną kondycji projektu. Python 3.14.2.
Wynik
| Biblioteka | Odzysk artykułu (wszystkie 22) | Wyciek boilerplate | Precyzja tokenów treści | Zanieczyszczające tokeny | Wygenerowano wynik |
|---|---|---|---|---|---|
| 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. Każda jednostka w każdej próbce ma unikalny token-sentinel, więc „odzyskane” i „wyciekłe” oznaczają dokładne wystąpienie podciągu, a nie wynik podobieństwa. Recall liczony jest dla wszystkich 22 próbek; wyciek i precyzja — dla 11 próbek zawierających zarówno artykuł, jak i boilerplate.
Warto rozdzielić trzy kolumny.
Odpowiedział na każdą stronę. goose3 i jusText tego nie zrobiły — odpowiednio 20 i 19 z 22. To ma większe znaczenie, niż się wydaje, bo precyzja i F1 w takiej tabeli są warunkowe wobec wygenerowania wyniku: biblioteka, która zwraca pusty ciąg, nie wchodzi do licznika ani po jednej, ani po drugiej stronie, więc „odmowa” jest darmowa. Precyzja goose3 na poziomie 1.0000 została policzona na 10 z 11 próbek; newspaper4k osiągnął 0.9452 na 11 z 11. To nie jest dokładnie ta sama miara.
Nie wyciekło nic. Próbki zawierają celowo adversarialny boilerplate — neutralnie sklasyfikowane bloki promocyjne stojące jako rodzeństwo artykułu, wątki komentarzy pod niewinnymi nazwami klas, bloki reklam nieopisane jako „ad”. Heurystyka Readability oparta na dołączaniu rodzeństwa „połknęła” kilka z nich; newspaper4k nie przepuścił żadnego.
Pominął jedną jednostkę z 74, i ta pominięta jednostka jest współdzielona.
Pominięcie dotyczy próbki bez klasycznej prozy — strony zbudowanej z tabel, bloku kodu, krótkich elementów i podpisu obrazka zamiast akapitów — a brakującą jednostką jest podpis. Nie jest w tym osamotniony:
| Biblioteka | Recall na stronie bez prozy | Pominięte jednostki |
|---|---|---|
| Readability | 1.000 | — |
| jusText | 1.000 | — |
| trafilatura | 0.875 | podpis |
| resiliparse | 0.875 | podpis |
| newspaper4k | 0.875 | podpis |
| goose3 | 0.250 | obie tabele, blok kodu, oba krótkie elementy, podpis |
Trzy biblioteki pomijają ten sam podpis i żadnej innej jednostki, co bardziej przypomina wspólne założenie odziedziczone niż trzy osobne błędy. Jeśli Twoje treści to dokumentacja, przepisy albo coś, gdzie podpis niesie informację, której nie ma w akapicie, warto to przetestować przed podjęciem decyzji — Readability i jusText zachowały ten element.
Ta sama próbka pokazuje też, że goose3 zupełnie się rozsypuje, tracąc trzy czwarte strony, więc „treść niebędąca prozą” to oś, na której te sześć narzędzi różni się znacznie bardziej, niż sugeruje nagłówek tabeli.
Pod względem szybkości mediana ekstrakcji newspaper4k na 22 próbkach wyniosła 2,69 ms, czyli najwolniej z całej szóstki, a najgorszy przypadek to 199,81 ms. W porównaniu z medianą resiliparse na poziomie 0,06 ms daje to w tym kontrolowanym teście różnicę 45×. Mediana może być mała w pracy na pojedynczej stronie, ale przepustowość i opóźnienia ogonowe pod obciążeniem nie były testowane. Zimny import mierzymy osobno poniżej.
Domyślna opcja, którą zmieniłbym w pierwszej linijce

Oficjalne źródło: dokumentacja newspaper4k.
Przegląd dostarczanego obiektu Configuration ujawnia 22 ustawienia. Jedno z nich wygląda tak:

_honor_robotstxt = False
newspaper4k nie respektuje robots.txt, chyba że mu to wyraźnie ustawisz. Jeśli pozwolisz mu pobierać treść — Article(url).download() bez input_html — pobierze to, na co wskażesz, niezależnie od zawartości pliku robots danej witryny.
To da się obronić jako domyślne zachowanie biblioteki, której głównym zadaniem jest parsowanie HTML, który już posiadasz. To natomiast fatalne zaskoczenie w produkcji, jeśli wskazałeś mu tysiąc adresów URL. Ustaw honor_robotstxt=True w Configuration albo przekaż input_html i pobieraj dane samodzielnie — tak właśnie zrobiłem w całym tym teście.
Dwie kolejne rzeczy warte zapamiętania:
number_threads = 10. Domyślna równoległość dla narzędzi obsługujących wiele artykułów wynosi dziesięć. Równoległość to nie to samo co liczba żądań na sekundę, ale może wywołać serię jednoczesnych requestów, jeśli nie ustawisz limitów per host i harmonogramu.
fetch_images = True. Pobieranie obrazów jest domyślnie włączone, co rodzi pytanie o użycie offline. Przy zablokowanym socket.connect testowana ścieżka newspaper4k 0.9.6 — download(input_html=…) i następnie parse() na jednym wejściu HTML trzymanym w pamięci — zakończyła się sukcesem, zwróciła 1 292 znaki i podjęła zero prób połączenia z siecią. Potwierdza to dokładnie tę ścieżkę, nie każdą konfigurację, wtyczkę, typ treści ani przyszłą wersję.
Reszta ustawień jest rozsądna: 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.
Rzeczywistość instalacji
pip install newspaper4k pobiera 22 pakiety i 47,5 MiB w około sześć sekund. Zimny import w świeżym podprocesie: 2,812 s — najwolniej w porównaniu.
| Biblioteka | Pakiety | site-packages | Zimny 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. Każda biblioteka działała w osobnym pustym virtualenv, więc nic nie dziedziczyło zależności po sąsiedzie.
2,812 sekundy na import to 187 razy więcej niż 15 milisekund resiliparse. W długo działającym workerze płacisz to raz i nie ma to znaczenia. W funkcji serverless płacisz przy każdym zimnym starcie, i to jest przypadek, w którym newspaper4k jest złym wyborem niezależnie od jakości ekstrakcji.
Jest też jedna szorstka krawędź przy instalacji. Import wypisuje ostrzeżenie:
UserWarning: nltk is not installed. Some NLP features will be unavailable. Install it with: pip install 'newspaper4k[nlp]'
Nic w tym teście nie potrzebowało tych funkcji i ekstrakcja działała bez problemu bez nich, ale podstawowa instalacja nie jest instalacją pełną, a newspaper4k[nlp] dociąga znacznie cięższe drzewo zależności oraz pobieranie korpusów. Uwzględnij to tylko wtedy, gdy zależy Ci na słowach kluczowych i streszczeniach.
Pamięć i wpływ uszkodzonego HTML
Dwie rzeczy, które w tej serii recenzji wcześniej były oznaczone jako nieprzetestowane, zostały teraz zmierzone.
Szerszy kontekst testu obciążeniowego znajdziesz w porównaniu pamięci i uszkodzonego HTML dla dziesięciu bibliotek.
Szczytowe zużycie pamięci rezydentnej, przez /usr/bin/time -l, osobny świeży proces dla każdej komórki — dolny próg importu to koszt samej załadowanej i bezczynnej biblioteki, a szczyty obejmują dokument.
| Biblioteka | Runtime | Próg importu (MiB) | Szczyt dla HTML 226 KB (MiB) | Szczyt dla 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. Bazowe wyniki Pythona i Node nie są ze sobą porównywalne; interpreter jest w obu przypadkach częścią kosztu.
Próg newspaper4k to 52,6 MiB, a szczyt dla 10 MB HTML to 668,5 MiB — drugi najwyższy wynik wśród bibliotek Pythona. Żadna z tych wartości nie stanowi problemu dla zwykłych stron; obie mają znaczenie, jeśli przetwarzasz duże dokumenty w workerze z limitem pamięci.
Uszkodzony HTML. Dwanaście dokumentów, z których każdy psuje dokładnie jedną rzecz — niezamykanie tagów, złą zagnieżdżoność elementów inline, niecytowane atrybuty ze spacjami, osierocone zamknięcia, brak <html> w ogóle, zduplikowane atrybuty, dokument ucięty w połowie taga, błędne encje, niezamknięty <script>, kłamliwa deklaracja charsetu, komentarz zawierający markup i 600 poziomów zagnieżdżenia — plus dwie poprawnie uformowane próbki kontrolne o dopasowanym rozmiarze, bo samo „zwrócił nic” mówi cokolwiek o uszkodzeniu tylko wtedy, gdy biblioteka nie milczy też na czystym dokumencie tej samej wielkości.
Próbki kontrolne i uszkodzone rozdzielają się wyraźnie w surowych wynikach:
| Grupa | Dokumenty | Zgłoszono błąd | Pusty wynik | Odzyskane oceniane sentinele |
|---|---|---|---|---|
| Poprawne kontrole o dopasowanym rozmiarze | 2 | 0 | 0 | nieużywane w wyniku dla uszkodzonych |
| Próbki uszkodzone | 12 | 0 | 10 | 5/33, z wyłączeniem przypadku z niezamkniętym <script> |
Dwie kontrole zwróciły 70 i 1 351 znaków, podczas gdy 10 z 12 uszkodzonych wejść zwróciło pusty ciąg. Dzięki temu cisza wyniku da się przypisać samemu uszkodzeniu w tym projekcie próbek, a nie po prostu krótkiemu wejściu. Ocenianie sprawdza sentinele w nagłówkach, akapitach i linkach we wszystkich jedenastu kwalifikujących się uszkodzonych dokumentach. Próbka z niezamkniętym <script> jest wyłączona, ponieważ zgodnie z parsowaniem HTML5 dalszy markup pozostaje zawartością skryptu. Zobacz malformed-results.json. To ważne ograniczenie odzyskiwania, które trzeba uwzględnić przy wyborze narzędzia, a nie tylko sukces typu „nie rzucił wyjątku”.
Plusy i minusy
Na korzyść. Brak oznaczonych tokenów boilerplate w tym porównaniu, wynik na wszystkich 22 kontrolowanych próbkach artykułowych i 0,9865 odzysku ocenianych jednostek artykułu. Ujawnia tekst artykułu oraz pola metadanych, choć dokładność metadanych nie była testowana. Testowana ścieżka z przekazanym HTML nie podejmowała żadnych prób sieciowych przy zablokowanym socket.connect. Gdy sprawdzano repozytorium, miało niedawny datowany push; szersza kondycja utrzymania projektu nie była oceniana.
Przeciwko. Najcięższy zimny import w zestawie: 2,812 s i 22 pakiety / 47,5 MiB zmierzonych site-packages. honor_robotstxt domyślnie ma wartość False, a pomocniki do wielu artykułów domyślnie używają dziesięciu wątków. Podstawowa instalacja ostrzega o brakującym NLTK, więc słowa kluczowe i streszczenia wymagają cięższej, opcjonalnej instalacji. Co najważniejsze, 10 z 12 uszkodzonych próbek zwróciło pusty wynik, mimo że obie poprawne próbki kontrolne dały tekst.
Kto powinien z tego korzystać, a kto nie
Rozważ newspaper4k, jeśli priorytetem jest: zwracać niepusty tekst na kontrolowanym korpusie nastawionym na artykuły, minimalizować oznaczony boilerplate w tym korpusie i zaakceptować wolniejszy zimny import. Przy takim jasno zdefiniowanym kryterium prowadził w tym porównaniu. Inne kryteria mogą wybrać Readability dla maksymalnego zachowania ocenianej treści albo resiliparse dla szybkości startu i mediany ekstrakcji.
Pomiń go albo przetestuj bardzo dokładnie, jeśli najważniejszy jest cold start, jeśli 47,5 MiB zmierzonych site-packages to istotny koszt albo jeśli liczy się odzyskiwanie po uszkodzonym HTML. Resiliparse uruchamiał się tu 187× szybciej, ale nie zrównał się z trafilatura we wszystkich kolumnach jakości: trafilatura miała wyższy recall artykułu, a ich profile wycieków i precyzji również się różniły. newspaper4k jest ukierunkowany na artykuły; list produktów i dashboardów nie testowano, więc nie deklarujemy tu żadnego zachowania dla takich przypadków.
Cokolwiek zrobisz, ustaw honor_robotstxt, jeśli pozwalasz bibliotece pobierać dane. To nie jest uwaga o wydajności.
Gdzie pasuje zarządzane API
newspaper4k potrafi parsować HTML dostarczony przez wywołującego i ma też ścieżki pobierania. Zarządzana usługa ekstrakcji przenosi pobieranie, renderowanie i pracę nad schematem za granicę dostawcy. Tworzymy Thunderbit, ale nie był on uruchamiany na tym zestawie próbek, więc ten przegląd nie daje podstaw do porównania jakości, renderowania, ochrony przed botami, opóźnień ani kosztów. Dla przechowywanego HTML artykułu przedstawione tu dowody dotyczą wyłącznie newspaper4k; cele niebędące artykułami wymagają własnej oceny.
Dla tych samych próbek przez wszystkie sześć ekstraktorów zobacz porównanie ekstrakcji w sześciu bibliotekach.
W przypadku rozwiązań hostowanych szerszy obraz daje nasz przegląd API do web scrapingu; dla alternatyw self-hosted — przewodnik po open-source scraperach. Jeśli tekst ma trafić do modelu, konwersja HTML do Markdown w Pythonie pokazuje, gdzie traci się wierność.
Wypróbuj Thunderbit do ekstrakcji danych z sieci
Czy warto używać newspaper4k?
Traktuj newspaper4k jako mocnego kandydata do ekstrakcji tekstu artykułów, gdy HTML jest już dostępny, a następnie zrób realny test porównawczy na własnym korpusie przed wdrożeniem. Zestaw kontrolowany potwierdza wysoki recall artykułu, brak oznaczonego boilerplate i niepusty wynik dla wszystkich 22 próbek artykułowych. Nie obejmuje jednak prawdziwych stron ani dokładności metadanych, a 10 z 12 uszkodzonych próbek zwróciło pusty wynik.
Jeśli korzystasz ze ścieżki pobierania, przejrzyj jawnie honor_robotstxt=False, dziesięciowątkową równoległość i limity per host. Jeśli cold start lub rozmiar zależności ma znaczenie, zmierz lokalny import trwający 2,812 s i obserwację 47,5 MiB site-packages w swojej infrastrukturze, zamiast traktować je jak uniwersalny koszt kontenera.
Wypróbuj Thunderbit do ekstrakcji danych z sieci Get Started Free
FAQ
Dlaczego set_html() nie działa?
Bo w newspaper4k taka metoda nie istnieje. HTML przekazuje się przez download(input_html=html), a potem wywołuje parse(). Wyniki wyszukiwania mogą pokazywać przykłady dla newspaper3k, więc łatwo o pomyłkę; ja popełniłem ją przy pierwszym uruchomieniu i poprawiłem test przed oceną.
Czy newspaper4k respektuje robots.txt?
Nie domyślnie. honor_robotstxt jest dostarczane jako False. Ustaw je na True w Configuration, jeśli pozwalasz bibliotece pobierać dane, albo przekaż input_html i pobieraj samodzielnie. Obsługa wielu artykułów domyślnie używa też dziesięciu wątków. To nie jest ustalona szybkość requestów, tylko niekontrolowana równoległość; ustaw jawne limity per host.
Czy parse() wykonuje żądania sieciowe?
W newspaper4k 0.9.6 testowana ścieżka download(input_html=…) + parse() nie podjęła żadnej próby połączenia dla jednego wejścia HTML, gdy socket.connect był zablokowany. Nie oznacza to, że każda konfiguracja parsera, wtyczka, typ treści czy przyszłe wydanie będą wolne od sieci.
Co oznacza ostrzeżenie o NLTK przy imporcie?
Podstawowa instalacja nie zawiera NLTK, więc ekstrakcja słów kluczowych i streszczeń jest niedostępna, a biblioteka informuje o tym przy imporcie. Sama ekstrakcja działa bez zmian — wszystko mierzone tutaj uruchomiono na podstawowej instalacji. pip install 'newspaper4k[nlp]' dodaje te funkcje wraz z cięższym drzewem zależności i pobieraniem korpusów.
Czego ten przegląd nie testował? Prawdziwych stron — to kontrolowane próbki z oznaczonymi jednostkami. Pola metadanych były zinwentaryzowane, ale nie oceniano dokładności tytułu, autora, daty ani obrazów. Nie testowano też ekstrakcji wielojęzycznej, dodatków NLP, wielowątkowego crawlownia źródeł ani przepustowości pod obciążeniem. Szczytowe zużycie pamięci procesu zmierzono na jednym wejściu HTML o rozmiarze 226 KB i jednym o rozmiarze 10 MB, a nie przy równoległości czy trwałym obciążeniu.


