簡體   English   中英

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

[英]How can I extract XML of a website and save in a file using Perl's LWP?

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

我是Perl的新手,我不知道如何做到這一點。

當然。 最簡單的方法是Web :: Scraper模塊。 它的作用是讓你定義包含的刮刀對象

  1. 哈希鍵名,
  2. 定位感興趣元素的XPath表達式,
  3. 以及從中提取數據位的代碼。

Scraper對象獲取URL並返回提取數據的哈希值。 如果需要,每個鍵的提取器代碼本身可以是另一個scraper對象,這樣您就可以定義如何刮擦重復的復合頁面元素:提供XPath以在外部刮刀中找到復合元素,然后提供更多的XPath來拉動在內部刮刀中分出它的各個位。 然后結果自動成為嵌套數據結構。

簡而言之,您可以非常優雅地將來自整個頁面的數據吸收到Perl數據結構中。 這樣,XPath + Perl的全部功能可用於任何頁面。 由於頁面是使用HTML :: TreeBuilder進行解析的,因此它的標簽是多么令人討厭。 生成的scraper腳本比基於正則表達式的scraper更容易維護,並且更容忍輕微的標記變化。

壞消息:到目前為止,它的文檔幾乎不存在,所以你必須通過谷歌搜索類似[ miyagawa web :: scraper ]的東西來找到模塊​​作者發布的示例腳本。

雖然通常LWP :: SimpleWWW :: MechanizeHTML :: Tree是從網頁中提取數據的好方法,但在這種特殊情況下(電視列表),有一種更簡單的方法:

XMLTVScheduleles Direct中的數據一起使用。 收取少量費用(每年20美元),但有一些優點:

  1. 解析代碼已經為您編寫(只需use XMLTV; )。
  2. 您不會違反雅虎的服務條款。
  3. 你不必與雅虎積極地試圖打破你的腳本。 (他們不喜歡自動腳本拉下電視節目單;見#2。)

如果要將信息傳遞給Javascript,請使用Javascript Object Notation(JSON)而不是XML。 有很多Perl庫,比如JSON :: Any ,可以為你處理。

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

但是,將頻道與節目信息相匹配將需要一些工作;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM