2009-02-14 46 views

回答

10

我还没有尝试过,但我最近读到Feedzirra(它声称性能待建): -

Feedzirra是饲料库, 设计的尽快获得并更新许多供稿 。这包括使用libcurl-multi的 通过 taf2-curb gem更快的http获取, 和libxml通过nokogiri和 sax-machine进行更快的解析。

3

您可以使用RFeedParser,这是一个(着名)Python Universal FeedParser的Ruby端口。它基于Hpricot,使用起来非常快速和简单。

http://rfeedparser.rubyforge.org/

一个例子:

require 'rubygems' 
require 'rfeedparser' 
require 'open-uri' 

feed = FeedParser::parse(open('http://feeds.feedburner.com/engadget')) 

feed.entries.each do |entry| 
    puts entry.title 
end 
1

当你只有一把锤子,一切看起来都像钉子。考虑一下除Ruby以外的解决方案。尽管我喜欢Ruby和Rails,并且不会将它们放在Web开发中,也可能不适用于特定于领域的语言,但我更喜欢大量提升您所描述的Java类型,或者Python甚至C++的类型。

鉴于这一目标解析数据很可能它可以为您的解决方案的轨道部分和其他语言的部分之间的共同点扮演一个数据库。然后,您正在使用最好的工具来解决您的每个问题,并且结果可能更容易处理,并且真正满足您的要求。

如果速度是至关重要的真正的,为什么在那里添加一个额外的约束和说,“哦,这只是一个本质,只要我得到使用Ruby。”

0

最初我使用nokogiri做了一些基本的xml解析,但它很慢且不稳定(有时)我切换到feedzirra,不仅有很大的性能提升,也没有错误,它像馅饼一样容易。如下图所示

# fetching a single feed 
feed = Feedzirra::Feed.fetch_and_parse("http://feeds.feedburner.com/PaulDixExplainsNothing") 

# feed and entries accessors 
feed.title   # => "Paul Dix Explains Nothing" 
feed.url   # => "http://www.pauldix.net" 
feed.feed_url  # => "http://feeds.feedburner.com/PaulDixExplainsNothing" 
feed.etag   # => "GunxqnEP4NeYhrqq9TyVKTuDnh0" 
feed.last_modified # => Sat Jan 31 17:58:16 -0500 2009 # it's a Time object 

entry = feed.entries.first 
entry.title  # => "Ruby Http Client Library Performance" 
entry.url  # => "http://www.pauldix.net/2009/01/ruby-http-client-library-performance.html" 
entry.author  # => "Paul Dix" 
entry.summary # => "..." 
entry.content # => "..." 
entry.published # => Thu Jan 29 17:00:19 UTC 2009 # it's a Time object 
entry.categories # => ["...", "..."] 

例子,如果你想用饲料做多,例如把它们解析,以下就足够了

source = Feedzirra::Feed.fetch_and_parse(http://www.feed-url-you-want-to-play-with.com) 
    puts "Parsing Downloaded XML....\n\n\n" 

    source.entries.each do |entry| 

    begin 
     puts "#{entry.summary} \n\n" 
     cleanURL = (entry.url).gsub("+","%2B") #my own sanitization process, ignore 
     scrapArticleWithURL(cleanURL) 
    rescue 
    puts "(****)there has been an error fetching (#{entry.title}) \n\n" 
    end