2009-02-14 7 views

risposta

10

non l'ho provato, ma ho letto su Feedzirra di recente (che sostiene di essere costruito per le prestazioni): -

Feedzirra è una libreria di alimentazione che è progettata per ottenere e aggiornare molti feed il più rapidamente possibile. Questo include usando libcurl-multi attraverso la gemma taf2- per ottenere http più veloce, e libxml tramite nokogiri e sax-machine per un'analisi più rapida.

0

Non sono sicuro circa le prestazioni, ma una domanda simile è stato risposto a Parsing Atom & RSS in Ruby/Rails?

Si potrebbe anche prendere in considerazione Hpricot, che analizza XML, ma si presume che sia ben formato e non fa alcuna convalida.

http://wiki.github.com/why/hpricot http://wiki.github.com/why/hpricot/hpricot-xml

+0

Hpricot è un parser HTML :( – collimarco

+0

HTML è un sottoinsieme di XML e Hpricot può analizzarlo.Un sacco di persone usa Hpricot per analizzare XML generale –

+0

http://wiki.github.com/why/hpricot/hpricot-xml –

3

È possibile utilizzare RFeedParser, un Ruby-port di (famoso) Python Universal FeedParser. È basato su Hpricot ed è veramente veloce e facile da usare.

http://rfeedparser.rubyforge.org/

Un esempio:

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

Quando tutto quello che hai è un martello, tutto sembra un chiodo. Considerare una soluzione diversa da Ruby per questo. Anche se amo Ruby e Rails e non vorrei separarmene per lo sviluppo web o forse per un linguaggio specifico del dominio, preferisco il pesante sollevamento dei dati del tipo che descrivi essere eseguito in Java, o forse in Python o anche in C++.

Dato che la destinazione di questi dati analizzati è probabilmente un database, può fungere da punto comune tra la parte Rails della soluzione e l'altra lingua. Quindi stai utilizzando lo strumento migliore per risolvere ciascuno dei tuoi problemi e il risultato è probabilmente più facile da lavorare e soddisfa veramente le tue esigenze.

Se la velocità è veramente essenziale, perché aggiungere un ulteriore vincolo e dire "Oh, è solo l'essenza finché uso Ruby".

0

inizialmente ho usato nokogiri per fare un semplice parsing xml, ma era lento e irregolare (a volte) sono passato a feedzirra e non solo c'era un grande incremento di prestazioni, non c'erano errori ed è facile come torta. Esempio illustrato di seguito

# 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 # => ["...", "..."] 

se si vuole fare di più con i feed, ad esempio le analisi, il seguente sarà sufficiente

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