使用Ruby解析标记中包含冒号的RSS项目?

时间:2011-03-23 21:58:28

标签: ruby parsing rss

我正在尝试解析具有此标记结构的RSS源中的信息:

<dc:subject>foo bar</dc:subject>

使用内置的Ruby RSS库。显然,做item.dc:subject会导致错误,但我无法找出任何方法来提取这些信息。有没有办法让这个工作?或者是否可以使用不同的RSS库?

3 个答案:

答案 0 :(得分:6)

带有':'的标签实际上是带有命名空间的XML标签。我从来没有使用RSS模块取得好成绩,因为Feed格式通常不符合规格,导致模块放弃。我强烈建议使用Nokogiri来解析feed,无论是RDF,RSS还是ATOM。

Nokogiri能够使用XPath访问器或CSS访问器,并且都支持名称空间。最后两行是等价的:

require 'nokogiri'
require 'open-uri'
doc = Nokogiri::XML(open('http://somehost.com/rss_feed'))
doc.at('//dc:subject').text
doc.at('dc|subject').text

在处理命名空间时,您需要将声明添加到XPath访问器:

doc.at('//dc:subject', 'dc' => 'link to dc declaration') 

See the "Namespaces" section了解更多信息。

如果没有网址或更好的示例,我无法做更多,但这应该让您指向更好的方向。

几年后,我使用处理RDF,RSS和ATOM的Nokogiri为我的工作写了一个大的RSS聚合器。 Ruby的RSS库不能完成任务,但Nokogiri很棒。

如果您不想自己动手,Paul Dix's Feedzirra是处理Feed的好宝石。

答案 1 :(得分:1)

RSS模块似乎能够执行这些XML命名空间属性,即<dc:date>,如下所示:

feed.items.each do |item| puts "Date: #{item.dc_date}" end

答案 2 :(得分:-1)

我认为item['dc:subject']可能有用。