2011-03-23 25 views
8

estoy tratando de analizar la información de un feed RSS que tiene esta estructura de etiquetas:Analizando un elemento RSS que tiene dos puntos en la etiqueta con Ruby?

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

utilizando el construido en la librería Ruby RSS. Obviamente, hacer item.dc:subject es arrojar errores, pero no puedo encontrar ninguna forma de sacar esa información. ¿Hay alguna forma de hacer que esto funcione? ¿O es posible con una biblioteca RSS diferente?

Respuesta

6

Las etiquetas con ':' en ellas son realmente etiquetas XML con un espacio de nombres. Nunca tuve buenos resultados al usar el módulo RSS porque los formatos de alimentación a menudo no cumplen con las especificaciones, lo que hace que el módulo se rinda. Recomiendo utilizar Nokogiri para analizar el feed, ya sea RDF, RSS o ATOM.

Nokogiri tiene la capacidad de usar accesadores XPath o accesadores CSS, y ambos admiten espacios de nombres. Las dos últimas líneas serían equivalentes:

require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::XML(open('http://somehost.com/rss_feed')) 
doc.at('//dc:subject').text 
doc.at('dc|subject').text 

Cuando se trata de espacios de nombres que necesitará añadir la declaración que el descriptor de acceso XPath:

doc.at('//dc:subject', 'dc' => 'link to dc declaration') 

See the "Namespaces" section para obtener más información.

Sin una URL o una muestra mejor, no puedo hacer más, pero eso debería apuntar en una mejor dirección.

Hace un par de años escribí un gran agregador de RSS para mi trabajo usando Nokogiri que manejaba RDF, RSS y ATOM. La biblioteca RSS de Ruby no estaba a la altura de la tarea, pero Nokogiri era increíble.

Si no desea hacer su propia tirada, Paul Dix's Feedzirra es una buena joya para procesar los alimentos.

+0

Ampliando esta idea, la gema 'arrogancia' se basa en nokogiri, y hace que analizar un feed sea tan simple como pasar la URL del feed y manipular la matriz de publicaciones devueltas. Rubygems: https://rubygems.org/gems/arrogance – providence

+0

Lo echaré un vistazo en algún momento. Cuando escribí mi agregador, no encontré nada que manejara la amplia gama de feeds totalmente desordenados que encontré. –

+0

Sí, Arrogance descubre las etiquetas para ti y las establece como [: título] [: autor] [: enlace] [: descripción] y [: fecha] pase lo que pase. – providence

-1

Creo que item['dc:subject'] podría funcionar.

+0

Si eso no funciona utilización [libxml] (http: //libxml.rubyforge .org /) –

+0

Sí, el analizador de rss ignora por completo las etiquetas que no reconoce, por lo que ni siquiera lo convierten en el objeto 'item'. Gorrón. ¿Cómo tomaría los elementos '' con 'libxml'? El árbol XML se parece a esto: '', 'pero haciendo doc.find ("// RDF: RDF/artículo"). Each' no es encontrar nada. –

+0

Recomiendo mirar en Nokogiri en lugar de libxml. Nokogiri es muy robusto y está bien respaldado. –

1

El módulo RSS parece tener la capacidad de hacer esos atributos de espacio de nombres XML, es decir <dc:date> así:

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

Cuestiones relacionadas