newspaper4k is a free, open source data extraction & web scraping project written in Python and released under MIT. It has 1,169 GitHub stars, 118 forks and 135 open issues, and was last pushed 25 hours ago. On this registry it ranks #110 of 149 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available. It gained 23 stars over the last 30 tracked days.

What is newspaper4k?

Newspaper4k is a Python library and command-line tool for extracting article text, titles, authors, publish dates, images and other metadata from news websites, built as an actively maintained fork of newspaper3k and aimed at developers, data journalists and dataset builders who need clean article content at scale.

What it is

Newspaper4k is a Python 3.10+ package that downloads and parses news articles, returning structured fields such as the article body text, title, authors, publish date, top image and embedded movies. It provides both a Python API and a bundled CLI, and it also supports parsing and scraping whole news sources rather than single URLs. The project began as a fork of newspaper3k by codelucas, which had not been updated since September 2020, and its stated initial goal was to keep that project alive while adding new features and fixing bugs. It lives in the Python news-scraping and dataset-preparation ecosystem, alongside the requests-style tooling its topics list names.

The concrete problem it solves is that newspaper3k was effectively abandoned: at the moment of the fork the original project carried over 400 open issues, which the maintainer duplicated. As of version 0.9.3, roughly 180 of those issues still need verification, with many already fixed but not yet confirmed. So Newspaper4k replaces a stalled dependency with a maintained one, giving projects that already relied on newspaper3k a drop-in path forward instead of a rewrite.

Key capabilities

  • Extract article body text, authors, publish_date, top_image and movies from a single URL through newspaper.article(...).
  • Run NLP post-processing with article.nlp() to populate article.keywords and article.summary.
  • Scrape and parse an entire news source, not just individual articles, for corpus and dataset preparation.
  • Drive extraction from the command line with python -m newspaper --url="..." --language=en --output-format=json --output-file=article.json.
  • Export results to JSON via the CLI's --output-format and --output-file options.
  • Preserve backward compatibility: all classes and methods from newspaper3k were kept, and the original API calls still work as expected.
  • Documented at newspaper4k.readthedocs.io, including a dedicated CLI reference and user guide.

Who uses it and how

  • Teams migrating off newspaper3k can keep existing code: the fork kept the original classes and methods, so familiar API calls continue to work.
  • Data journalists and researchers building article corpora run the CLI per URL or in loops, writing JSON files for downstream analysis.
  • Dataset preparation pipelines that need language-tagged article extraction can pass --language to the CLI and collect metadata alongside text.
  • Python developers who need authors, publish dates and top images for media monitoring or aggregation pull those attributes straight off the returned article object.
  • Anyone blocked by the 400-plus open issues in the unmaintained original can move to a fork that still reports active issue tracking and feature work.

Getting started

Install from PyPI with pip install newspaper4k, which requires Python 3.10 or newer. After install, either call newspaper.article('...') from Python or run the CLI with python -m newspaper --url="..." --language=en --output-format=json --output-file=article.json.

How it compares

Newspaper4k sits directly downstream of newspaper3k by codelucas: it is the maintained continuation of that same codebase rather than an independent reimplementation. Because the fork kept every original class and method, comparison on licence or data ownership does not arise here — both are Python tools under the same MIT licence and run locally, and the practical difference is maintenance. Anyone choosing between them is choosing between a project last updated in September 2020 and a fork that still ships features and tracks its issue backlog.

When to use it — and when not to

Pick Newspaper4k if you want locally run, MIT-licensed article extraction in Python and you value API compatibility with newspaper3k. Do not pick it if you need a stable, fully triaged issue tracker: the README states that around 180 inherited issues still need verification, and that checking them is cumbersome enough that the maintainer is asking for contributors. The README excerpt also does not describe deployment infrastructure such as databases, storage backends or SMTP, so the operating burden appears limited to running Python itself — but the breadth of real-world site compatibility will track how quickly that inherited issue backlog gets worked through.

project readme (upstream, from github) — read inline

Newspaper4k: Article Scraping & Curation, a continuation of the beloved newspaper3k by codelucas

PyPI version Build status Coverage status Documentation Status

Newspaper4k Project grew from a fork of the well known newspaper3k by codelucas which was not updated since September 2020. The initial goal of this fork was to keep the project alive and to add new features and fix bugs. As of version 0.9.3 there are many new features and improvements that make Newspaper4k a great tool for article scraping and curation. To make the migration to Newspaper4k easier, all the classes and methods from the original project were kept and the new features were added on top of them. All API calls from the original project still work as expected, such that for users familiar with newspaper3k you will feel right at home with Newspaper4k.

At the moment of the fork, in the original project were over 400 open issues, which I have duplicated, and as of v 0.9.3 only about 180 issues still need to be verified (many are already fixed, but it's pretty cumbersome to check - hint hint ... anyone contributing?). If you have any issues or feature requests please open an issue here.

Experimental ChatGPT helper bot for Newspaper4k: ChatGPT helper

Python compatibility

- Python 3.10+ minimum

Quick start

pip install newspaper4k

Using the CLI

You can start directly from the command line, using the included CLI:

python -m newspaper --url="https://edition.cnn.com/2023/11/17/success/job-seekers-use-ai/index.html" --language=en --output-format=json --output-file=article.json

More information about the CLI can be found in the CLI documentation.

cli demo

Using the Python API

Alternatively, you can use Newspaper4k in Python:

Processing one article / url at a time

import newspaper

article = newspaper.article('https://edition.cnn.com/2023/10/29/sport/nfl-week-8-how-to-watch-spt-intl/index.html')

print(article.authors)
# ['Hannah Brewitt']

print(article.publish_date)
# 2023-10-29 09:00:15.717000+00:00

print(article.text)
# New England Patriots head coach Bill Belichick, right, embraces Buffalo Bills head coach Sean McDermott ...

print(article.top_image)
# https://media.cnn.com/api/v1/images/stellar/prod/231015223702-06-nfl-season-gallery-1015.jpg?c=16x9&q=w_800,c_fill

print(article.movies)
# []

article.nlp()
print(article.keywords)
# ['patrick', 'mahomes', 'history', 'nfl', 'week', 'broncos', 'denver', 'p', 'm', '00', 'pittsburgh',...]


print(article.summary)
# Kevin Sabitus/Getty Images Denver Broncos running back Javonte Williams evades Green Bay Packers safety Darnell Savage, bottom.
# Kathryn Riley/Getty Images Kansas City Chiefs quarterback Patrick Mahomes calls a play during the Chiefs' 19-8 Thursday Night Football win over the Denver Broncos on October 12.
# Paul Sancya/AP New York Jets running back Breece Hall carries the ball during a game against the Denver Broncos.
# The Broncos have not beaten the Chiefs since 2015, and have never beaten Chiefs quarterback Patrick Mahomes.
# Australia: NFL+, ESPN, 7Plus Brazil: NFL+, ESPN Canada: NFL+, CTV, TSN, RDS Germany: NFL+, ProSieben MAXX, DAZN Mexico: NFL+, TUDN, ESPN, Fox Sports, Sky Sports UK: NFL+, Sky Sports, ITV, Channel 5 US: NFL+, CBS, NBC, FOX, ESPN, Amazon Prime

source demo

Parsing and scraping whole News Sources (websites) using the Source Class

This way you can build a Source object from a newspaper websites. This class will allow you to get all the articles and categories on the website. When you build the source, articles are not yet downloaded. The build() call will parse front page, will detect category links (if possible), get any RSS feeds published by the news site, and will create a list of article links. You need to call download_articles() to download the articles, but note that it can take a significant time.

download_articles() will download the articles in a multithreaded fashion using ThreadPoolExecutor from the concurrent package. The number of concurrent threads can be configured in Configuration.number_threads or passed as an argument to build().

import newspaper

cnn_paper = newspaper.build('http://cnn.com', number_threads=3)
print(cnn_paper.category_urls())

# ['https://cnn.com', 'https://money.cnn.com', 'https://arabic.cnn.com',
# 'https://cnnespanol.cnn.com', 'http://edition.cnn.com',
# 'https://edition.cnn.com', 'https://us.cnn.com', 'https://www.cnn.com']

article_urls = [article.url for article in cnn_paper.articles]
print(article_urls[:3])
# ['https://arabic.cnn.com/middle-east/article/2023/10/30/number-of-hostages-held-in-gaza-now-up-to-239-idf-spokesperson',
# 'https://arabic.cnn.com/middle-east/video/2023/10/30/v146619-sotu-sullivan-hostage-negotiations',
# 'https://arabic.cnn.com/middle-east/article/2023/10/29/norwegian-pm-israel-gaza']


article = cnn_paper.articles[0]
article.download()
article.parse()

print(article.title)
# المتحدث باسم الجيش الإسرائيلي: عدد الرهائن المحتجزين في غزة يصل إلى

Or if you want to get bulk articles from the website (have in mind that this could take a long time and could get your IP blocked by the newssite):

import newspaper

cnn_source = newspaper.build('http://cnn.com', number_threads=3)

print(len(newspaper.article_urls))

articles = source.download_articles()

print(len(articles))

print(articles[0].title)

As of version 0.9.3, Newspaper4k supports Google News as a special Source object

First, make sure you have the google extra installed, since we rely on the Gnews package to get the articles from Google News. You can install it using pip like this:

pip install newspaper4k[gnews]

Then you can use the GoogleNews class to get articles from Google News:

from newspaper.google_news import GoogleNewsSource

source = GoogleNewsSource(
    country="US",
    period="7d",
    max_results=10,
)

source.build(top_news=True)

print(source.article_urls())
# ['https://www.cnn.com/2024/03/18/politics/trump-464-million-dollar-bond/index.html', 'https://www.cnn.com/2024/03/18/politics/supreme-court-new-york-nra/index.html', ...
source.download_articles()

Multilanguage features

Newspaper can extract and detect languages seamlessly based on the article meta tags. Additionally, you can specify the language for the website / article. If no language is specified, Newspaper will attempt to auto detect a language from the available meta data. The fallback language is English.

Language detection is crucial for accurate article extraction. If the wrong language is detected or provided, chances are that no article text will be returned. Before parsing, check that your language is supported by our package.

from newspaper import Article

article = Article('https://www.bbc.com/zhongwen/simp/chinese-news-67084358')
article.download()
article.parse()

print(article.title)
# 晶片大战:台湾厂商助攻华为突破美国封锁?

if article.config.use_meta_language:
  # If we use the autodetected language, this config attribute will be true
  print(article.meta_lang)
else:
  print(article.config.language)

# zh

Docs

Check out The Docs for full and detailed guides using newspaper.

Features

  • Multi-threaded article download framework
  • Newspaper website category structure detection
  • News url identification
  • Google News integration
  • Text extraction from html
  • Top image extraction from html
  • All image extraction from html
  • Keyword building from the extracted text
  • Automatic article text summarization
  • Author extraction from text
  • Easy to use Command Line Interface (python -m newspaper....)
  • Output in various formats (json, csv, text)
  • Works in 80+ languages (English, Chinese, German, Arabic, ...) see LANGUAGES.md for the full list of supported languages.

Evaluation

Evaluation Results

Using the dataset from ScrapingHub I created an evaluator script that compares the performance of newspaper against it's previous versions. This way we can see how newspaper updates improve or worsen the performance of the library.

Scraperhub Article Extraction Benchmark

Version Corpus BLEU Score Corpus Precision Score Corpus Recall Score Corpus F1 Score
Newspaper3k 0.2.8 0.8660 0.9128 0.9071 0.9100
Newspaper4k 0.9.0 0.9212 0.8992 0.9336 0.9161
Newspaper4k 0.9.1 0.9224 0.8895 0.9242 0.9065
Newspaper4k 0.9.2 0.9426 0.9070 0.9087 0.9078
Newspaper4k 0.9.3 0.9531 0.9585 0.9339 0.9460
Newspaper4k 0.9.4 0.9531 0.9585 0.9339 0.9460
Newspaper4k 0.9.5 0.9531 0.9585 0.9339 0.9460
Newspaper4k 0.9.6 0.9531 0.9585 0.9339 0.9460

Precision, Recall and F1 are computed using overlap of shingles with n-grams of size 4. The corpus BLEU score is computed using the nltk's bleu_score.

We also use our own, newly created dataset, the Newspaper Article Extraction Benchmark (NAEB) which is a collection of over 400 articles from 200 different news sources to evaluate the performance of the library.

Newspaper Article Extraction Benchmark

Version Corpus BLEU Score Corpus Precision Score Corpus Recall Score Corpus F1 Score
Newspaper3k 0.2.8 0.8445 0.8760 0.8556 0.8657
Newspaper4k 0.9.0 0.8357 0.8547 0.8909 0.8724
Newspaper4k 0.9.1 0.8373 0.8505 0.8867 0.8682
Newspaper4k 0.9.2 0.8422 0.8888 0.9240 0.9061
Newspaper4k 0.9.3 0.8695 0.9140 0.8921 0.9029
Newspaper4k 0.9.4 0.8689 0.9140 0.8921 0.9029
Newspaper4k 0.9.5 0.8689 0.9140 0.8921 0.9029
Newspaper4k 0.9.6 0.8696 0.9136 0.8898 0.9015

Requirements and dependencies

The package has two kinds of requirements:

  • System libraries (needed for lxml and image support)
  • Python package dependencies (installed via pip or a pinned requirements.txt)

System packages (common)

  • Pillow: libjpeg-dev, zlib1g-dev, libpng-dev (or libpng12-dev on older systems)
  • lxml: libxml2-dev, libxslt1-dev
  • Python development headers: python3-dev

Debian / Ubuntu (install prerequisites):

    sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev libjpeg-dev zlib1g-dev libpng-dev

macOS (Homebrew):

    brew install libxml2 libxslt
    brew install libtiff libjpeg webp little-cms2

Installing the package (pip)

Basic install:

    pip install newspaper4k

Optional extras

Newspaper4k exposes several optional extras that enable additional features:

  • gnews — Google News integration (gnews package)
  • nlp — NLP helpers (e.g. nltk)
  • cloudflare — cloudscraper for Cloudflare-protected sites
  • zh, th, ja, bn, hi,np, ta - language-specific NLP support (e.g. jieba for Chinese)
  • all — a convenience extra that installs many language and helper packages

Examples:

    pip install newspaper4k[gnews]
    pip install "newspaper4k[gnews,nlp]"
    pip install newspaper4k[all]

Use whichever extras you need; extras can be combined as shown above.

Install using uv (recommended for reproducible, pinned installs)

uv can generate a pinned requirements.txt from pyproject.toml which is handy for deployments or for reproducible installs.

  1. Install uv (if you don't have it):

     pip install uv
    
  2. add the newspaper4k package to your project using uv add (you must be in a project directory with a pyproject.toml file):

     uv add newspaper4k
    

or if you want to include extras:

    uv add --all-groups newspaper4k

or uv add --group gnews newspaper4k

Notes

  • If you encounter problems with libpng12-dev, try libpng-dev instead.
  • The optional extras are declared in pyproject.toml under [project.optional-dependencies] (for example gnews, nlp, cloudflare, all).

Contributing

see CONTRIBUTING.md

LICENSE

Authored and maintained by Andrei Paraschiv.

Newspaper was originally developed by Lucas Ou-Yang (codelucas), the original repository can be found here. Newspaper is licensed under the MIT license.

Credits

Thanks to Lucas Ou-Yang for creating the original Newspaper3k project and to all contributors of the original project.

Frequently asked questions

Is newspaper4k free to use?

newspaper4k is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does newspaper4k do?

📰 Newspaper4k a fork of the beloved Newspaper3k. Extraction of articles, titles, and metadata from news websites.

What is newspaper4k written in?

newspaper4k is primarily written in Python. Its source is publicly available at https://github.com/AndyTheFactory/newspaper4k, and it has 1,169 GitHub stars.