Разбор элемента RSS с двоеточием в теге с Ruby? - PullRequest
8 голосов
/ 24 марта 2011

Я пытаюсь проанализировать информацию из ленты RSS, которая имеет такую ​​структуру тегов:

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

, используя встроенную библиотеку Ruby RSS.Очевидно, что выполнение item.dc:subject вызывает ошибки, но я не могу найти способ извлечь эту информацию.Есть ли способ заставить это работать?Или это возможно с другой библиотекой RSS?

Ответы [ 3 ]

6 голосов
/ 24 марта 2011

Теги с ':' в действительности являются тегами XML с пространством имен.У меня никогда не было хороших результатов при использовании модуля RSS, потому что форматы каналов часто не соответствуют спецификациям, в результате чего модуль сдался.Я настоятельно рекомендую использовать Nokogiri для разбора канала, будь то 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') 

См. «Пространства имен»."section для получения дополнительной информации.

Без URL-адреса или лучшего примера я не смогу сделать больше, но это поможет вам указать правильное направление.

Пару лет янаписал большой агрегатор RSS для моей работы, используя Nokogiri, который обрабатывал RDF, RSS и ATOM.RSS-библиотека Руби не подходила для этой задачи, но Нокогири был великолепен.

Если вы не хотите бросать свои собственные, Feedzirra Пола Дикса - это хороший камень для обработки каналов.1019 *

1 голос
/ 19 марта 2014

Модуль RSS , похоже, способен выполнять эти атрибуты пространства имен XML, то есть <dc:date>, например:

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

0 голосов
/ 24 марта 2011

Я думаю item['dc:subject'] может работать.

...