RSS 被认为是基于 XML(或 XML/RDF)标准的。不幸的是,RSS 背后那个以牛仔作风闻名的社区有很多离经叛道的成分,生成的消息包(feed)甚至都不是结构良好的 XML。Mark Pilgrim 开发的 Universal Feed Parser 是一个很好的工具,能够解析结构不完善的消息包,本篇技巧将介绍如何使用这个工具从 RSS 中抽取消息包信息。
XML 到处都有标准,但让每个人都照规矩行事并不是一件容易的事。Web 以蔑视 HTML 和 XHTML 标准的网页而出名,这也是造成很多受到广泛关注的问题的缘由。W3C 的 Dave Raggett 开发了颇受欢迎的工具 Tidy(请参阅 参考资料) 来挽救这种局面,它将“标签汤”(粗心和结构错误的 HTML)转化成结构良好的 XHTML。RSS 是另一个理论标准被混乱的现实打破的例子。更糟的是,RSS 存在很多相互竞争的标准,有一些相差甚大。沿着 Raggett 的思路,Mark Pilgrim 开发了 Universal Feed Parser,用他的话来说就是“极端自由的 RSS 解析器”。但 Universal Feed Parser 的功能不止于此,引用文档中的说法:
Universal Feed Parser 是一个下载和解析连锁消息包的 Python 模块。它可以处理 RSS 0.90、Netscape RSS 0.91、Userland RSS 0.91、RSS 0.92、RSS 0.93、RSS 0.94、RSS 1.0、RSS 2.0、Atom 和 CDF 消息包。
从这个列表就可以看出人们为何把 RSS 和混乱联系在一起。Atom(请参阅 我最近撰写的相关文章) 本来希望给 RSS 一个全新的面貌,但实际上仅仅增加了一种选择。所幸的是,Universal Feed Parser 吸收了大家所能设想到的各种消息包格式,包括那些宣称遵循某种 RSS 标准但又有细微不同的消息包。本文给出的示例代码利用 Universal Feed Parser 能够处理各种 RSS 消息包。
清单 1 示范了 Universal Feed Parser 的用法,它从给定的 URL 读入 RSS 并在控制台上显示消息包中的基本信息。
清单 1. 在标准输出中显示消息包信息
import sys |
清单 COMMON_CHANNEL_PROPERTIES
和 COMMON_ITEM_PROPERTIES
定义了频道和特别关注的每个条目的属性。Use Universal Feed Parser 尝试使用最常见的名称提供对最常用属性的访问,而不考虑不同 RSS 版本间的差异。清单 1 列出的条目名称适用于 Universal Feed Parser 所能识别的任何格式的任何消息包。工具文档中有一节题为“Content Normalization”,讨论了如何处理源格式术语的差异。 feedinfo
是主函数,负责接收 URL 和可选的输出流(类似文件的对象),默认输出流为系统输出(控制台)。 feedparser.parse
是惟一需要知道的 Universal Feed Parser API。它在一个数据结构中返回所有的消息包数据,可以像嵌套对象那样访问这种数据结构,或者像嵌套词典那样访问(如果愿意的话)。比如,可以使用 feed_data.feed
或 feed_data.['feed']
访问顶层频道或者消息包属性。
剩下的代码打印顶层消息包的细节和每个条目。它提供了有限的格式化特性,比如将很长的属性值缩减到给定的字符数(由 COMMON_CHANNEL_PROPERTIES
和 COMMON_ITEM_PROPERTIES
列表中每一条的第三项决定)。注意,我在处理 Use Universal Feed Parser 的字符串时使用了 Unicode。该工具就是使用 Unicode 对象表示数据,从而很好地保证了消息包数据的国际化。但是如果您恰好对包含非 ASCII 字符的消息包运行 清单 1,那么可能在打印语句中遇到编码错误。如果出现这种情况,则需要明确使用 Python 的 Unicode 设施更小心地处理输出(可以用标准 codecs
模块中的 Unicode 编码器包装输出流)。
下面的片段是对 IBM DeveloperWorks 首页的 RSS 消息包运行 清单 1 的结果,这是一个结构良好的 RSS 2.0 消息包。为了便于查看,我添加了一些新行,并把消息包项减为两个。
清单 2. 对 RSS 消息包运行清单 1
$ python listing1.py http://www.ibm.com/developerworks/news/dw_dwtp.rss |
![]() ![]() |
![]()
|
我 曾经多次使用 Universal Feed Parser 作为一种过滤器工具,将任意的消息包转化成 RSS 1.0。它负责最困难的那部分任务,比如应付无法预料的输入。Universal Feed Parser 的测试包给我留下了深刻的印象,它展示了 Mark Pilgrim 为处理 RSS 领域的种种古怪行为付出了多么大的努力。可能有那么一天,RSS 的创建者和用户会就某种消息包格式(比如 Atom)达成一致,但是在那遥远的一天来临之前,Universal Feed Parser 对于每个需要编写代码处理 Weblog 之类信息的人来说,都是一个不可或缺的工具。
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- 请访问 feedparser.org,详细了解 Universal Feed Parser,其中还包括一些下载资料和文档。
- 关于 RSS 的更多讨论,请参阅:
- “ Python Web 服务开发人员:用于 Python 的 RSS”(developerWorks,2002 年 11 月,Uche Ogbuji 和 Mike Olson)
- “ 技巧: 从远程 RDF 文件获取标题”(developerWorks,2002 年 4 月,Nicholas Chase)
- “ 从远程 RSS 文件抓取标题”(developerWorks,2003 年 9 月,Nicholas Chase)
- “ Building a Semantic Web Site”(Eric van der Vlist)
- “ The myth of RSS compatibility”(Universal Feed Parser 的作者是 Mark Pilgrim,这篇文章详述了几种不兼容的 RSS 变体)
- 关于 Atom 的更多信息,请参阅“ Thinking XML: 使用 Atom 格式连锁新闻及其他内容”(Uche Ogbuji,developerWorks,2004 年 3 月)。Atom 的主页是 atomenabled.org。
- 关于错综复杂的 XML/Unicode/Python 的交叉,请参阅“ Proper XML Output in Python”。
- 请在 developerWorks 上访问 Mark Pilgrim 的网络 Weblog。
- 请参阅“ Clean up your Web pages with HTML TIDY”,进一步了解 Dave Raggett 开发的工具。
- developerWorks XML 专区中有大量关于 XML 的内容, 实用技巧列出了所有最新的技巧。
- developerWorks Developer Bookstore 提供了各种关于 XML 的书籍。
- 了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。
![]() | ||
![]() | Uche Ogbuji 是 Fourthought Inc. 的顾问兼创始人,该公司是一家专为企业知识管理提供 XML 解决方案的软件供应商和咨询公司。Fourthought 开发了 4Suite,这是一个用于 XML、RDF 和知识管理应用程序的开放源代码平台。Ogbuji 先生还是 Versa RDF 查询语言的首席开发人员。他是一位出生于尼日利亚的计算机工程师和作家,目前生活和工作在美国科罗拉多的博耳德。您可以通过 uche.ogbuji@fourthought.com 和 Ogbuji 先生联系。 |