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>タグ内のすべてを取得しています。

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リリース版を通過したときに印刷したい。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 に答える