如何从Perl中的HTML表中提取数据?

nic*_*ick 5 html perl parsing

可能重复:
您能提供一个用您喜欢的解析器解析HTML的示例吗?
如何使用Perl从HTML文件中提取内容?


我正在尝试在Perl中使用正则表达式来解析具有以下结构的表.第一行如下:

<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr>
Run Code Online (Sandbox Code Playgroud)

在这里,我希望取出"Time Played","Artist","Title"和"Label",并将它们打印到输出文件中.

任何帮助都会受到极大的折磨!

对不起......我尝试了很多正则表达式,例如:

$lines =~ / (<td>) /
       OR
$lines =~ / <td>(.*)< /
       OR
$lines =~ / >(.*)< /
Run Code Online (Sandbox Code Playgroud)

我当前的程序看起来像这样:

#!perl -w

open INPUT_FILE, "<", "FIRST_LINE_OF_OUTPUT.txt" or die $!;

open OUTPUT_FILE, ">>", "PLAYLIST_TABLE.txt" or die $!;

my $lines = join '', <INPUT_FILE>;

print "Hello 2\n";

if ($lines =~ / (\S.*\S) /) {
print "this is 1: \n";
print $1;
    if ($lines =~ / <td>(.*)< / ) {
    print "this is the 2nd 1: \n";
    print $1;
    print "the word was: $1.\n";
    $Time = $1;
    print $Time;
    print OUTPUT_FILE $Time;
    } else {
    print "2ND IF FAILED\n";
    }
} else { 
print "THIS FAILED\n";
}

close(INPUT_FILE);
close(OUTPUT_FILE);
Run Code Online (Sandbox Code Playgroud)

Eth*_*her 16

不要使用regexps来解析HTML.有大量的CPAN模块可以更有效地为您完成此任务.

  • @Sinan:我的理论是,正则表达式存在一种特殊的学习曲线:起初他们看起来如此令人兴奋,以至于他们不能(或不应该)做任何事情.任何看起来像解析问题的东西*必须*可以用正则表达式解决. (2认同)

Sin*_*nür 11

使用HTML :: TableExtract.真.

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TableExtract;
use LWP::Simple;

my $file = 'Table3.htm';
unless ( -e $file ) {
    my $rc = getstore(
        'http://www.ntsb.gov/aviation/Table3.htm',
        $file);
    die "Failed to download document\n" unless $rc == 200;
}

my @headers = qw( Year Fatalities );

my $te = HTML::TableExtract->new(
    headers => \@headers,
    attribs => { id => 'myTable' },
);

$te->parse_file($file);

my ($table) = $te->tables;

print join("\t", @headers), "\n";

for my $row ($te->rows ) {
    print join("\t", @$row), "\n";
}
Run Code Online (Sandbox Code Playgroud)

这就是我在"任务特定的"HTML解析器的另一篇文章中的意思.

你可以节省大量的时间,将精力放在阅读一些文档上,而不是将正则表达式扔到墙上,看看是否有任何问题.