我想编写一个Perl脚本来获取网页的html内容,然后抓取一个表的内容。确切的页面是:
http://djbpmstudio.com/Default.aspx?Page=album&id=1
到目前为止,我能够使用以下代码正确表达艺术家,专辑和流派以及表格中的第一个条目:
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 :(得分: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];
}
}
答案 1 :(得分:2)
使用HTML::TableExtract从表格中抓取数据,这将使您的生活更轻松。