找到与匹配内容
,在这种情况下,“磁盘空间使用情况”,然后找到下一个。一旦你有一个元素树:
my $usage = $t->look_down(
_tag => 'td',
sub {
$_[0]->as_trimmed_text() =~ /^Disk Space Usage$/
}
)->right()->as_trimmed_text();
您可能想包装在一个eval块中,以防look_down没有找到匹配。
HTML :: Element中的树导航方法是有效使用HTML :: TreeBuilder的关键部分。
莫希尼问:“为什么不工作?”
(格式化由我添加)
use strict;
use warnings;
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_file("index.html");
my $disk_value; my $disk_space;
for ($tree->look_down(_tag => q{tr}, 'class' => 'row-odd')) {
$disk_space = $tree->look_down(
_tag => q{td},
'class' => 'stats_left'
)->as_trimmed_text;
if ($disk_space eq 'Home Directory') {
$disk_value = $tree->look_down(_tag => q{td}, 'class' => 'stats_right')
->right()
->as_trimmed_text();
}
}
print STDERR "my home value is $disk_space : $disk_value\n";
look_down开始从你调用它的根节点,低头元素树(这些树木长得颠倒),并返回要么匹配的节点列表或第一个匹配节点,具体取决于上下文。
由于所有向下看的调用都在树上,因此每次循环都会重复找到相同的节点。
你的循环应该看起来更像是这样的:
my %table_stuff;
for my $odd_row ($tree->look_down(_tag => q{tr}, 'class' => 'row-odd')) {
$heading = $odd_row->look_down(
_tag => q{td},
'class' => 'stats_left'
);
$table_stuff{ $heading->as_trimmed_text() } = $heading->right()->as_trimmed_text();
}
该填充的哈希表与元素。
如果你只想要一个值,根本不要使用循环。 look_down已经充当一个循环。
my $heading = $t->look_down(
_tag => 'td',
sub {
$_[0]->as_trimmed_text() =~ /^Home Directory$/
}
);
my $value = $heading->right();
# Now $heading and $value have HTML::Element nodes that you can do whatever you want with.
my $disk_value = $value->as_trimmed_text();
my $disk_space = $heading->as_trimmed_text();