通过perl脚本进行HTML解析

时间:2012-11-06 05:42:05

标签: html perl parsing html-parsing perl-module

我正在尝试通过perl脚本解析HTML文件。我正在使用一个名为HTML :: TreeBuilder的模块。

这是我到目前为止所做的:

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new; 

$tree->parse_file("sample.html");

foreach my $anchor ($tree->find("p")) {

  print $anchor->as_text, "\n";

}

工作正常。我收到了< p>标记内的所有内容。

sample.html文件:

< td>Release Version:< /td>< td> 5134< /td>< /tr>

< tr class="d0">< td>Executed By:< /td>< td>spoddar< /td>< /tr>

< tr class="d1">< td> Duration:< /td>< td>0 Hrs 0 Mins 0 Secs < /td>< /tr>

< tr class="d0">< td>#TCs Executed:< /td>< td>1< /td>< /tr>

当我通过发行版时,我希望打印5134。 同样,当我通过Execute By时,我希望打印spoddar。 这些不是HTML标记。但有没有办法获得这个?

2 个答案:

答案 0 :(得分:3)

最直接的做法是过滤所需的标签并浏览文本。以下方法采用样本中的格式,使用2列表。

sub get_value {
    my $key = shift;

    foreach my $tr ($tree->find('tr')) {
        my @td = $tree->find('td');
        return $td[1]->as_text if $td[0]->as_text eq $key;
    }
    return;
}

print get_value('Release Version:');

答案 1 :(得分:2)

HTML::ParserHTML::TokeParser也可能对您有用

UNTESTED

use HTML::TokeParser;

my $p = HTML::TokeParser->new('sample.html');

while (my $token = $p->get_token) {
    my $tokenType = shift @{$token}; # 'S' is start tag 'E' end tag etc. (see doc)
    if ($tokenType =~ /S/) {
        my ($tag, $attr, $attrseq, $rawtxt) = @{$token};
        my $class = $attr->{class}; #get tag class
        if ($class =~ /d0/ && $tag =~ /tr/) {
            print "$p->get_trimmed_text('/tr')\n";
        }
    }
}