reader

lemon24BSD-3-Clause活跃维护

Python 的订阅源阅读库,支持 RSS、Atom、JSON Feed 和播客,可用来抓取、解析并管理订阅内容,方便在应用里集成阅读器功能。

A Python feed reader library.

3.27发布于 2026-10-11 10:16 UTC561star64fork同步于 2026-11-10 06:01 UTC

怎么上手

README 里没有找到可直接复制的安装命令

README 里没有找到可直接复制的安装命令,请到 README 或官方文档查看安装方式。

硬件要求

README 没有说明硬件要求。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

这个项目的说明还在生成中,先参考下面「最近发版」和 README。

最近发版

5 个版本3.27
  1. 3.27最新正式版2026-10-11 · 2026-10-11 10:16 UTC

    make_reader(migrate: bool). Support Python 3.15 and PyPy 3.12; drop Python 3.11. Stop vendoring feedparser. See changelog for details.

  2. 3.262026-06-24 · 2026-06-24 12:42 UTC
    查看更新说明

    Full database exports. See changelog for details.

  3. 3.252026-05-25 · 2026-05-25 12:30 UTC
    查看更新说明

    Feed autodiscovery. Fix 3.24 migration failures. See changelog for details.

  4. 3.242026-05-20 · 2026-05-20 11:57 UTC
    查看更新说明

    Structured authors. Fix update_feeds(workers=) not being parallel. Use structured logging. Web app contextual help and other improvements. See changelog and annotated release notes for details.

  5. 3.232026-04-24 · 2026-04-24 12:21 UTC
    查看更新说明

    OPML support. See changelog and annotated release notes for details.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    .. begin-intro

    reader is a Python feed reader library.

    It is designed to allow writing feed reader applications without any business code, and without depending on a particular framework; in MVC terms, you'd probably call it a fat model.

    .. end-intro

    |build-status-github| |code-coverage| |documentation-status| |pypi-status| |type-checking| |code-style|

    .. |build-status-github| image:: https://github.com/lemon24/reader/workflows/build/badge.svg :target: https://github.com/lemon24/reader/actions?query=workflow%3Abuild :alt: build status (GitHub Actions)

    .. |code-coverage| image:: https://codecov.io/gh/lemon24/reader/branch/master/graph/badge.svg?token=lcLZaSFysf :target: https://codecov.io/gh/lemon24/reader :alt: code coverage

    .. |documentation-status| image:: https://readthedocs.org/projects/reader/badge/?version=latest&style=flat :target: https://reader.readthedocs.io/en/latest/?badge=latest :alt: documentation status

    .. |pypi-status| image:: https://img.shields.io/pypi/v/reader.svg :target: https://pypi.python.org/pypi/reader :alt: PyPI status

    .. |type-checking| image:: http://www.mypy-lang.org/static/mypy_badge.svg :target: http://mypy-lang.org/ :alt: checked with mypy

    .. |code-style| image:: https://img.shields.io/badge/code%20style-black-000000.svg :target: https://github.com/psf/black :alt: code style: black

    .. begin-features

    reader allows you to:

    • retrieve, store, and manage Atom, RSS, and JSON feeds
    • mark articles as read or important
    • add arbitrary tags/metadata to feeds and articles
    • filter feeds and articles
    • full-text search articles
    • get statistics on feed and user activity
    • import / export feeds as OPML
    • automatically discover feeds in web pages
    • write plugins to extend its functionality
    • skip all the low level stuff and focus on what makes your feed reader different

    ...all these with:

    • a stable, clearly documented API
    • excellent test coverage
    • fully typed Python

    What reader doesn't do:

    • depend on a web framework
    • have an opinion of how or where you use it

    In addition, reader provides:

    • an optional web application based on Flask, Bootstrap, and htmx
    • an optional command-line interface

    .. end-features

    Documentation: reader.readthedocs.io_

    .. _reader.readthedocs.io: https://reader.readthedocs.io/

    Usage:

    .. begin-usage

    .. code-block:: bash

    $ pip install reader
    

    .. code-block:: python

    >>> from reader import make_reader
    >>>
    >>> reader = make_reader('db.sqlite')
    >>> reader.add_feed('http://www.hellointernet.fm/podcast?format=rss')
    >>> reader.update_feeds()
    >>>
    >>> entries = list(reader.get_entries())
    >>> [e.title for e in entries]
    ['H.I. #108: Project Cyclops', 'H.I. #107: One Year of Weird', ...]
    >>>
    >>> reader.mark_entry_as_read(entries[0])
    >>>
    >>> [e.title for e in reader.get_entries(read=False)]
    ['H.I. #107: One Year of Weird', 'H.I. #106: Water on Mars', ...]
    >>> [e.title for e in reader.get_entries(read=True)]
    ['H.I. #108: Project Cyclops']
    >>>
    >>> reader.update_search()
    >>>
    >>> for e in reader.search_entries('year', limit=3):
    ...     title = e.metadata.get('.title')
    ...     print(title.value, title.highlights)
    ...
    H.I. #107: One Year of Weird (slice(15, 19, None),)
    H.I. #52: 20,000 Years of Torment (slice(17, 22, None),)
    H.I. #83: The Best Kind of Prison ()
    

    .. end-usage