用Ruby解析标签中冒号的RSS项目?

问题描述:

我试图解析从具有这种标签结构的RSS提要的信息:用Ruby解析标签中冒号的RSS项目?

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

使用内置的Ruby RSS库。很明显,做item.dc:subject是抛出错误,但我不知道任何方式来拉出该信息。有什么办法让这个工作?或者是否有可能使用不同的RSS库?

其中具有':'的标签实际上是具有名称空间的XML标签。我从来没有使用RSS模块获得好结果,因为提要格式通常不符合规格,导致模块放弃。我强烈建议使用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获取更多信息。

没有URL或更好的示例我不能做更多的事情,但这应该让你指出一个更好的方向。

几年来,我使用处理RDF,RSS和ATOM的Nokogiri为我的工作写了一个大的RSS聚合器。 Ruby的RSS库没有完成任务,但是Nokogiri非常棒。

如果你不想推出自己的产品,Paul Dix's Feedzirra是一个很好的加工饲料宝石。

+0

扩展这个想法,gem'arrogance'建立在nokogiri之上,并且可以像传入提要URL和操作返回的帖子数组一样简单地解析提要。 Rubygems:https://rubygems.org/gems/arrogance – providence 2011-08-17 17:08:16

+0

我会在一段时间看看它。当我编写我的聚合器时,没有发现处理我遇到的各种完全混乱的聚合。 – 2011-08-18 22:56:43

+0

Yup,Arrogance发现你的标签,无论如何设置它们为[:title] [:author] [:link] [:description]和[:date]。 – providence 2011-08-18 23:01:20

我认为item['dc:subject']可能工作。

+0

如果说://libxml.rubyforge .org /) – 2011-03-24 00:14:40

+0

是的,rss解析器完全忽略了它无法识别的那些标签,所以它们甚至不会将它放到'item'对象中。游民。我如何用'libxml'获取''元素? XML树看起来是这样的:'',但这样做'doc.find( “// RDF:RDF /项目”)。each'没有找到任何东西。 – 2011-03-24 01:18:44

+0

我建议看看Nokogiri而不是libxml。 Nokogiri非常强大并得到很好的支持。 – 2011-03-24 06:13:42

RSS模块似乎有做那些XML命名空间属性的能力,即<dc:date>这样的:不能正常工作使用[libxml的(HTTP

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