2011-04-26 7 views
0

Webページのhtmlコンテンツを取得してからテーブルの内容をスクラップするPerlスクリプトを作成したいと思います。正確なページは次のとおりです。テーブルのPerl Screen Scrapeデータ

http://djbpmstudio.com/Default.aspx?Page=album&id=1

これまでのところ、私はアーティスト、アルバム、およびジャンルはRegexだけでなく、以下のコード使用して、表の最初のエントリができています:では

use LWP::Simple; 

$url = "http://djbpmstudio.com/Default.aspx?Page=album&id=1"; 
my $mystring = get($url) or die "Error fetching source page."; 
$mystring =~ s/[\r\n]/ /g;  #remove line breaks from HTML 
$mystring =~ s/(>)\s+(<)/$1$2/g; #Remove white space between html tags 
#print $mystring; 

if($mystring =~ m{</table><h1>(.*?) - (.*?) - (.*?)</h1>}) { 
    #Get Artist name and print 
    print "Artist: $1\n"; 
    print "Album: $2\n"; 
    print "Genre: $3\n\n"; 

    if($mystring =~ m{</tr><tr class="row-(.*?)"><td>(.*?)</td><td align="right">(.*?)</td></tr>}) { 
     #Get Songname and BPM and print 
     #print "$1\t"; 
     print "$2\t"; 
     print "$3\n"; 
    } 
} 

をネストIFの場合、クラスは "row-a"と "row-b"の間を交互になります。

私はどのようにリストを下り、それぞれの曲名とBPMをすべて取得するのか分かりません。後で処理するためにソング名とBPMを配列に入れたいと思っています。

ありがとうございます。

+0

[RegExはXHTML自己完結型タグを除くオープンタグと重複する可能性があります](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – outis

答えて

4

regular expressions to process HTMLを使用することは、ほとんど常に悪い考えです。

悪くないでください。

HTMLデータを処理するためのHTMLデータを認識するモジュールを使用します。

#!/usr/bin/perl 
use warnings; 
use strict; 
use LWP::Simple; 
use HTML::TableExtract; 

my $html = get 'http://djbpmstudio.com/Default.aspx?Page=album&id=1'; 

my $te = new HTML::TableExtract(headers => ['Track Name', 'BPM']); 
$te->parse($html); 
foreach my $ts ($te->table_states) { 
    foreach my $row ($ts->rows) { 
     next unless $row->[0] =~ /\w/; # skip garbage rows 
     printf "%-20s ==> %.2f\n", $row->[0], $row->[1]; 
    } 
} 
+0

完璧!ありがとうございました。 – CrzySheeit

2

HTML::TableExtractを使用してテーブルからデータをスクラブすると、それはあなたの人生をはるかに簡単にします。