1

我正在尝试通过我的 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>标签内的所有东西。

示例.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当我通过发布版本时,我想被打印。以同样的方式spoddar,当我通过 Execute By 时,我想被打印出来。这些不是 HTML 标签。但是有没有办法获得这个?

4

2 回答 2

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:');
于 2012-11-06T06:24:37.057 回答
2

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


未经测试

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";
        }
    }
}

于 2012-11-06T06:31:00.717 回答