Webfeeder
Build RSS and Atom webfeeds from HTML files
Install / Use
/learn @emacsmirror/WebfeederREADME
#+TITLE: Emacs Webfeeder
Webfeeder is an Emacs library to generate [[https://en.wikipedia.org/wiki/RSS][RSS]] and [[https://en.wikipedia.org/wiki/Atom_(Web_standard)][Atom]] feeds from HTML files.
Other webfeed generators have been written for Emacs, but either they are tied to other projects like blog generators, or they only work on Org files like =ox-rss=. Since Webfeeder generates webfeeds from HTML files, it is more general.
The various elements of the HTML input are parsed with customizable functions. For instance, Webfeeder offers two functions to parse the title: ~webfeeder-title-libxml~ (using libxml if your Emacs is linked against it) and the less reliable ~webfeeder-title-default~. Feel free to write you own function and bind ~webfeeder-title-function~ before generating the feeds.
The generated feeds should be valid on https://validator.w3.org/feed/. If not, it's a bug, please report.
The full list of customizable functions is documented in ~webfeeder-html-files-to-items~.
- Installation
Get the package, either from [[https://guix.info][Guix]] or ELPA:
: M-x package-install RET webfeeder RET
Or clone / download this repository and modify your ~load-path~.
: (add-to-list 'load-path (expand-file-name "/path/to/this-package/" user-emacs-directory))
Load the package with
: (require 'webfeeder)
It's recommended to have an Emacs built against libxml, although basic support without libxml is also provided.
- Usage
- Build an Atom feed:
#+begin_src elisp (webfeeder-build "atom.xml" "./public" "https://example.org/" '("post1.html" "post2.html" "post3.html") :title "My homepage" :description "A collection of articles in Atom") #+end_src
- To build an RSS feed, use the RSS builder:
#+begin_src elisp (webfeeder-build "rss.xml" "./public" "https://example.org/" '("post1.html" "post2.html" "post3.html") :title "My homepage" :description "A collection of articles in RSS" :builder 'webfeeder-make-rss) #+end_src
- Use a custom title query function:
#+begin_src elisp (defun my-title-query (html-file) "Return the title from the "title" class in the HTML file." (with-temp-buffer (insert-file-contents html-file) (let* ((dom (libxml-parse-html-region (point-min) (point-max))) (title (dom-text (car (dom-by-class dom "title"))))) (if (string= "" title) nil title))))
(let ((webfeeder-title-function 'my-title-query)) (webfeeder-build ; ...)) #+end_src
- Limit the feed to 20 articles:
#+begin_src elisp (webfeeder-build ; ... :max-entries 20) #+end_src
- Filter some entries with a predicate
#+begin_src elisp (defun item-author-is-Alice-p (item) (string= (webfeeder-item-author item) "Alice")
(webfeeder-build ; ... :predicate 'item-author-is-Alice-p) #+end_src
See the documentation of ~webfeeder-build~ for more options.
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
