我正在尝试通过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标记。但有没有办法获得这个?
答案 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::Parser和HTML::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";
}
}
}