我正在尝试解析具有此标记结构的RSS源中的信息:
<dc:subject>foo bar</dc:subject>
使用内置的Ruby RSS库。显然,做item.dc:subject
会导致错误,但我无法找出任何方法来提取这些信息。有没有办法让这个工作?或者是否可以使用不同的RSS库?
答案 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']
可能有用。