rss feed 是严格遵循 rss 2.0 规范的 xml 文件,须以 开头,包含必选 channel 字段(title、link、description)和 item 的 title 与 link,pubdate 需符合 rfc 822 格式,生成时须用 elementtree 正确处理编码、转义与命名空间,并确保响应头为 application/rss+xml; charset=utf-8。

RSS Feed 就是一份严格格式的 rss 根节点 XML 文件
RSS Feed 不是服务、不是平台,也不是某种 API 接口,它就是一个静态(或动态生成)的 XML 文件,必须以 <rss version="2.0"></rss> 开头,且能被 feedparser、xml.etree.ElementTree 或主流阅读器(如 Feedly、Inoreader)直接加载解析。一旦格式出错——哪怕只是 pubDate 少个空格、时区写成 +0800 而非 +0800(RFC 822 要求带空格)——整个 feed 就会被拒绝订阅。
-
channel必须包含title、link、description,缺一不可;部分聚合器会直接忽略无link的 channel - 每个
item至少要有title和link;guid建议设为稳定唯一值(如文章 slug),否则同一内容可能被重复推送 -
pubDate必须是 RFC 822 格式,例如Mon, 10 Feb 2026 01:55:00 +0800,Python 中可用datetime.strftime("%a, %d %b %Y %H:%M:%S %z")但要注意%z在 Windows 上不兼容,得手动拼接时区
用 Python 的 xml.etree.ElementTree 生成 RSS 时最常踩的坑
很多人用 ElementTree 拼接节点后直接写入文件,结果 feed 无效——问题往往不在结构,而在命名空间、编码和换行处理。
- 不要手动字符串拼接 XML,避免
、<code>&等字符未转义导致解析失败;ElementTree会自动处理,但前提是所有文本都走text/tail属性赋值 - 输出时务必指定
encoding="utf-8"并加 XML 声明:用tree.write(path, encoding="utf-8", xml_declaration=True),否则中文会乱码,某些阅读器直接跳过 - 别忘了设置
Content-Type: application/rss+xml; charset=utf-8响应头(如果是 Web 服务提供 feed),Nginx/Apache 默认可能返回text/plain,导致浏览器下载而非解析
为什么你的 RSS 在本地能打开,上线后就“订阅失败”?
常见原因是路径、HTTPS 和 MIME 类型三者之一没对齐,而不是 XML 内容本身有问题。
在整本书中我们所涉及许多的Flex框架源码,但为了简洁,我们不总是显示所指的代码。当你阅读这本书时,要求你打开Flex Builder,或能够访问Flex3框架的源码,跟随着我们所讨论源码是怎么工作及为什么这样做。 如果你跟着阅读源码,请注意,我们经常跳过功能或者具体的代码,以便我们可以对应当前的主题。这样能防止我们远离当前的主题,主要是讲解代码的微妙之处。这并不是说那些代码的作用不重要,而是那些代码处理特别的案例,防止潜在的错误或在生命周期的后面来处理,只是我们当前没有讨论它。有需要的朋友可以下载看看
- 检查 feed URL 是否可被公开访问:用
curl -I https://yoursite.com/feed.xml看返回状态码是否为200,且Content-Type是application/rss+xml - 确保链接中所有
link和guid值都是绝对 URL(含https://),相对路径在跨域聚合场景下会被丢弃或解析错误 - 如果网站启用了 HTTPS,但 feed 中混用了
http://链接,部分现代阅读器(尤其是移动端)会因混合内容拦截而静默失败
Feed 流形态不影响 XML 结构,但决定你后续怎么扩展
RSS XML 本身只定义“有什么”,不定义“怎么推”。所谓“推模式”“拉模式”“分层推送”,全是服务端逻辑,XML 文件本身没有区别。
- 想做热度排序?RSS 规范不支持
<hotness></hotness>字段,只能靠自定义命名空间(如<content></content>)或额外字段(需阅读器支持),主流工具基本无视 - 需要按用户活跃度推送不同内容?那得在服务端动态生成多个 feed(如
/feed/hot.xml、/feed/fresh.xml),每个仍是标准 RSS 2.0 - 真正影响兼容性的,是是否严格遵循
rss 2.0DTD(即使不校验 DTD,也要保证必选字段存在、日期格式合法、编码统一)
最容易被忽略的点:很多开发者花时间调算法、加字段,却没验证生成的 XML 是否能被 feedparser.parse() 正常加载——建议每次部署后,用一行命令快速回归:python -c "import feedparser; print(feedparser.parse('https://yoursite.com/feed.xml').bozo)",返回 0 才算过关。









