如何从网站(http://tv.yahoo.com/listings)中提取信息并创建XML文件?我想保存它以便稍后解析,并使用JavaScript显示信息。
我对Perl很陌生,不知道如何实现。
如何从网站(http://tv.yahoo.com/listings)中提取信息并创建XML文件?我想保存它以便稍后解析,并使用JavaScript显示信息。
我对Perl很陌生,不知道如何实现。
当然。最简单的方法是使用 Web::Scraper 模块。它允许你定义由以下几个部分组成的抓取器对象:
抓取器对象接受一个 URL 并返回提取的数据哈希表。如果需要,每个键的提取器代码本身也可以是另一个抓取器对象,这样您就可以定义如何抓取重复的复合页面元素:在外部抓取器中提供查找复合元素的 XPath,然后在内部抓取器中提供一堆更多的 XPath 来提取其各个部分。结果自动成为嵌套的数据结构。
简而言之,您可以非常优雅地将页面上的数据提取到 Perl 数据结构中。在这样做时,XPath + Perl 的全部功能可用于针对任何页面使用。由于页面是使用 HTML::TreeBuilder 解析的,因此无论标签嵌套有多糟糕,都没有关系。生成的抓取器脚本比基于正则表达式的抓取器更易于维护,并且容忍性更强,可以容忍轻微的标记变化。
不好的消息是,目前它的文档几乎不存在,因此您必须通过搜索类似 [miyagawa web::scraper] 这样的内容来查找模块作者发布的示例脚本。
虽然通常使用LWP::Simple或WWW::Mechanize和HTML::Tree从网页中提取数据是不错的方法,但在这种特定情况下(电视节目清单),有一种更简单的方法:
使用XMLTV与Schedules Direct的数据。虽然有少量费用(每年20美元),但有以下优点:
use XMLTV;
)。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
然而,将回传通道与程序信息匹配需要一些工作;-)