RSS / Atom 订阅源读取器
当脚本需要读取订阅源,并且希望在不同格式(RSS 2.0 和 Atom)下获得统一的规范化数据结构,且无需第三方依赖时,使用此技能。它通过一次 ElementTree 遍历,从两种格式中提取 title、link、id、published 和 summary,使得下游代码(去重、摘要、告警)无需根据订阅源类型分支处理。
何时调用
- 用户说:“读取这个 RSS 订阅源”、“轮询博客订阅源”、“获取 Atom 订阅源的最新条目”、“监控网站的新文章”。
- 代码已获取订阅源字节数据,需要结构化条目。
何时不调用
- 源提供真实的 JSON API——应直接调用 API,而不是抓取订阅源。
- 需要完整的 feedparser 异常处理(处理各种格式错误的方言)——安装
feedparser。
具体示例
用户输入:
读取 https://example.com/feed.xml 并打印每篇文章的标题和链接。
输出:
# 将 assets/feed.py 复制到你的项目中,然后:
from urllib.request import urlopen
from feed import parse_feed
with urlopen("https://example.com/feed.xml", timeout=20) as r:
for item in parse_feed(r.read()):
print(item["title"], "->", item["link"])
每个条目都是一个字典,无论订阅源是 RSS 还是 Atom,键名都相同,因此可以通过 id 去重、按 published 排序,无需特殊处理。
应用模式
- 使用
xml.etree.ElementTree一次解析;遍历item(RSS)和{atom}entry(Atom)。 - 规范化为稳定的键集合,使管道的其余部分与订阅源格式无关。
- 从
guid/Atom 的id回退到链接,确保每个条目都有稳定的身份标识用于去重。 - 将网络操作排除在解析器之外:传入字节或文本数据,使其保持纯净且可测试。
参考:assets/feed.py。
来源
提炼自作者的个人新闻聚合项目。v1.0.0。 另见:[[gmail-imap-digest]]、[[sqlite-state]]、[[pipeline-orchestrator]]。
→ 使用 Trawlkit 构建完整的可运行机器人。