2011-03-23 31 views
8

我試圖解析從具有這種標籤結構的RSS提要的信息:用Ruby解析標籤中冒號的RSS項目?

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

使用內置的Ruby RSS庫。很明顯,做item.dc:subject是拋出錯誤,但我不知道任何方式來拉出該信息。有什麼辦法讓這個工作?或者是否有可能使用不同的RSS庫?

回答

6

其中具有':'的標籤實際上是具有名稱空間的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

-1

我認爲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

1

RSS模塊似乎有做那些XML命名空間屬性的能力,即<dc:date>這樣的:不能正常工作使用[libxml的(HTTP

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