我可以使用哪个模块在Perl CGI脚本中解析RSS提要?

5
我正在尝试找一个能够与Perl CGI脚本一起使用的RSS解析器。我发现了simplepie,这是一个在PHP脚本中非常容易使用的解析器。不幸的是,它不能与Perl CGI脚本配合使用。如果有类似于simplepie的东西,请让我知道。
我找到了这个RssDisplay,但我不确定如何使用以及它的好坏。
2个回答

6

来自CPANXML::RSS::Parser

XML::RSS::Parser是一个轻量级的自由解析器,用于解析RSS源。这个解析器“自由”在于它不要求遵循特定的RSS版本,并且会尝试优雅地处理它不期望或不理解的标签。解析器唯一的要求是文件是格式良好的XML并远程类似于RSS。

#!/usr/bin/perl

use strict; use warnings;

use XML::RSS::Parser;
use FileHandle;

my $parser = XML::RSS::Parser->new;

unless ( -e 'uploads.rdf' ) {
    require LWP::Simple;
    LWP::Simple::getstore(
        'http://search.cpan.org/uploads.rdf',
        'uploads.rdf',
    );
}
my $fh = FileHandle->new('uploads.rdf');
my $feed = $parser->parse_file($fh);

print $feed->query('/channel/title')->text_content, "\n";

my $count = $feed->item_count;
print "# of Items: $count\n";

foreach my $i ( $feed->query('//item') ) {
    print $i->query('title')->text_content, "\n";
}

2
“远程类似于RSS” - 毫无疑问是我几个月来读过的最好的技术规格之一... - DVK
@DVK:你意识到那是从CPAN复制粘贴的吗?就像我的回答一样——直接复制/粘贴。为了给出信用,这个代码块不是来自于那个CPAN链接。 - vol7ron

1

可用的 Perl 模块


  • XML::RSS::Tools

  • XML::RSS::Parser:

    #!/usr/bin/perl -w
    use strict;
    
    use XML::RSS::Parser;
    use FileHandle;
    
    my $p = XML::RSS::Parser->new;
    my $fh = FileHandle->new('/path/to/some/rss/file');
    my $feed = $p->parse_file($fh);
    
    # 输出一些值
    my $feed_title = $feed->query('/channel/title');
    print $feed_title->text_content;
    my $count = $feed->item_count;
    print " ($count)\n";
    foreach my $i ( $feed->query('//item') ) { 
       my $node = $i->query('title');
       print '  '.$node->text_content;
       print "\n"; 
    }  
    
  • XML::RSS::Parser::Lite (纯 Perl):

    use XML::RSS::Parser::Lite;
    use LWP::Simple;
    
    my $xml = get("http://url.to.rss");
    my $rp = new XML::RSS::Parser::Lite;
    $rp->parse($xml);
    
    print join(' ', $rp->get('title'), $rp->get('url'), $rp->get('description')), "\n";
    
    for (my $i = 0; $i < $rp->count(); $i++) {
       my $it = $rp->get($i);
       print join(' ', $it->get('title'), $it->get('url'), $it->get('description')), "\n";
    } 
    
  • dirtyRSS:

    use dirtyRSS;
    
    $tree = parse($in);
    die("$tree\n") unless (ref $tree);
    disptree($tree, 0);
    

查看Sinan的答案,那里有另一个XML::RSS::Parser的例子 - 这是我推荐使用的模块。 - vol7ron
嗨,谢谢。我在阅读了这里的内容之后尝试安装xml::rss模块,但是模块没有成功安装。我正在等待托管公司技术支持来查看此问题。我会研究你提到的并尝试一下。 - JDesigns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接