如何使用Perl的LWP提取网站的XML并保存在文件中?

时间:2008-10-21 07:50:49

标签: javascript xml perl extract lwp

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

我是Perl的新手,我不知道该怎么做。

4 个答案:

答案 0 :(得分:11)

当然。最简单的方法是 Web::Scraper 模块。它的作用是让你定义由

组成的scraper对象
  1. 哈希键名称,
  2. 定位感兴趣元素的XPath表达式,
  3. 以及从中提取数据的代码。
  4. Scraper对象获取一个URL并返回提取数据的哈希值。如果需要,每个键的提取器代码本身可以是另一个scraper对象,这样您就可以定义如何刮擦重复的复合页面元素:提供XPath以在外部刮刀中找到复合元素,然后提供更多的XPath来拉动在内部刮刀中分出它的各个位。然后,结果将自动成为嵌套数据结构。

    简而言之,您可以非常优雅地将来自整个页面的数据吸收到Perl数据结构中。这样,XPath + Perl的全部功能可用于任何页面。由于页面是使用HTML :: TreeBuilder进行解析的,因此它的标签是多么令人讨厌。生成的scraper脚本比基于正则表达式的scraper更容易维护,并且更容忍轻微的标记变化。

    坏消息:到目前为止,它的文档几乎不存在,因此您必须通过Google搜索来查找[miyagawa web::scraper]之类的内容,以查找模块作者发布的示例脚本。

答案 1 :(得分:3)

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

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

  1. 已经为您编写了解析代码(仅use XMLTV;)。
  2. 您不会违反雅虎的服务条款。
  3. 你不必与雅虎积极地试图打破你的剧本。 (他们不喜欢自动脚本拉下电视节目单;见#2。)

答案 2 :(得分:1)

如果要将信息传递给Javascript,请使用Javascript Object Notation(JSON)而不是XML。有很多Perl库,例如JSON::Any,可以为您处理。

答案 3 :(得分: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

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