Какая лучшая библиотека для разбора RSS / Atom в Perl?


Я заметил, что XML::RSS::Parser не обновлялся с 2005 года. Это все еще рекомендуемая библиотека для разбора RSS или Atom? Есть ли лучший или лучший способ?

4 13

4 ответа:

Я не уверен, что это когда-либо была "рекомендуемая библиотека". Если я знаю, какой тип канала мне нужно разобрать, я использую XML:: RSS или XML::Atom, но если (что более вероятно) я просто знаю, что это веб-канал, я использую XML::Feed.

Добавление примера использования XML:: Feed по запросу..

use XML::Feed;

my $feed = XML::Feed->parse(\$string_containing_feed);

foreach ($feed->entries) {
  print $_->title, "\n";
  print $_->content->body, "\n";
}

Все это в значительной степени скопировано из документации модуля.

Если XML:: RSS:: Parser работает для вас, то используйте его. Я использовал XML:: Parser для работы с RSS, но у меня были узкие требования, и XML::Parser уже был установлен.

Просто потому, что что-то было обновлено в течение нескольких лет, не означает, что это больше не работает; я не думаю, что различные спецификации RSS/Atom изменились недавно, поэтому нет необходимости в изменении синтаксического анализатора.

На самом деле мне нравится избегать специфичных для домена XML-парсеров в эти дни и просто использовать XPath для всего. Таким образом, мне нужно запомнить только один API. (Если это не огромный XML, то я буду использовать синтаксический анализатор на основе событий, такой как XML::Parser .)

Таким образом, используя XML:: XPath, я могу захватить кучу вещей из файла RSS, как это:

my $rss = get_rss();
my $xp = XML::XPath->new( xml => $rss );

my $stories = $xp->find( '/rss/channel/item' );

foreach my $story( $stories->get_nodelist ) {
    my $url   = $xp->find( 'link',  $story )->string_value;
    my $title = $xp->find( 'title', $story )->string_value;
    ...
}
Не самый красивый код в мире, но он работает.

Есть также очень хороший модуль под названием XML::FeedPP (см. http://search.cpan.org/dist/XML-FeedPP/lib/XML/FeedPP.pm). FeedPP не так быстро, но он написан на почти чистом Perl и имеет минималистичные зависимости.