3

如何从网站 ( http://tv.yahoo.com/listings ) 中提取信息,然后从中创建 XML 文件?我想保存它以便稍后解析并使用 JavaScript 显示信息?

我对 Perl 很陌生,我不知道该怎么做。

4

4 回答 4

11

当然。最简单的方法是Web::Scraper模块。它的作用是让您定义刮板对象,这些对象包括

  1. 哈希键名,
  2. 定位感兴趣元素的 XPath 表达式,
  3. 以及从中提取数据位的代码。

Scraper 对象采用 URL 并返回提取数据的哈希值。如有必要,每个键的提取器代码本身可以是另一个刮板对象,以便您可以定义如何刮取重复的复合页面元素:提供 XPath 以在外部刮板中查找复合元素,然后提供更多 XPath 来拉取在内部刮刀中取出其各个位。结果会自动成为一个嵌套的数据结构。

简而言之,您可以非常优雅地将整个页面中的数据吸入 Perl 数据结构中。这样做时,XPath + Perl 的全部功能可用于任何页面。由于页面是用 HTML::TreeBuilder 解析的,所以它的 tagoup 有多糟糕并不重要。生成的爬虫脚本比基于正则表达式的爬虫更容易维护,并且更能容忍微小的标记变化。

坏消息:到目前为止,它的文档几乎不存在,所以你必须通过谷歌搜索类似 [ miyagawa web::scraper ] 来找到模块​​作者发布的示例脚本。

于 2008-10-21T07:59:42.707 回答
3

虽然通常LWP::SimpleWWW::MechanizeHTML::Tree是从网页中提取数据的好方法,但在这种特殊情况下(电视节目表),有一种更简单的方法:

XMLTV与来自Schedules Direct的数据一起使用。收取少量费用(20 美元/年),但有以下优势:

  1. 解析代码已经为您编写好了(只是use XMLTV;)。
  2. 您不会违反雅虎的服务条款。
  3. 您不必与 Yahoo 积极尝试破坏您的脚本打交道。(他们不喜欢自动脚本拉下电视节目表;见 #2。)
于 2008-10-21T16:53:33.703 回答
1

如果要将信息传递给 Javascript,请使用 Javascript 对象表示法 (JSON) 而不是 XML。有很多 Perl 库,例如JSON::Any,可以为您处理这些问题。

于 2008-10-21T17:27:54.773 回答
1

tv.yahoo.com 不是很语义化,也不是很容易抓取!它们可能是更好的替代品或饲料?

使用 pQuery 我可以快速获取时间和节目......

use pQuery;
pQuery( 'http://tv.yahoo.com/listings' )
    ->find( '.show' )->each(
        sub {
            my $n = shift;
            my $pQ = pQuery( $_ ); 
            say $pQ->text;
        }
    );

  # => 4:00pm - 6:30pm Local Programming

要了解更多细节,你可以试试这个....

use pQuery;
my @tv_progs;
pQuery( 'http://tv.yahoo.com/listings' )
    ->find( 'li div strong' )->each(
        sub {
            my $n = shift;
            my $pQ = pQuery( $_ ); 
            $tv_progs[ $n ]->{ time } = $pQ->text;
        }
    )
    ->end
    ->find( '.showTitle' )->each( 
        sub {
            my $n = shift;
            my $pQ = pQuery( $_ ); 
            $tv_progs[ $n ]->{ name } = $pQ->text;
        }
    );

for my $prog ( @tv_progs ) {
    say $prog->{name} . " @ " . $prog->{time};
}

   # => Local Programming @ 4:00pm - 6:30pm

并获得频道....

use pQuery;
pQuery( 'http://tv.yahoo.com/listings' )
->find( '.chhdr a' )->each(
    sub {
        my $n = shift;
        my $pQ = pQuery( $_ ); 
        say $pQ->text;
    }
);

  # => ABC

然而,将反向频道与节目信息相匹配需要一些工作;-)

于 2008-10-21T21:58:24.103 回答