0

以下はhtmlファイルの私のデータです。「HTML::TreeBuilder」を使用してhtmlファイルの値を検索したい

<table id="stats" cellpadding="0" cellspacing="0">
<tbody>
    <tr class="row-even">
        <td class="stats_left">Main Domain</td>
        <td class="stats_right"><b>myabcab.com</b></td>
    </tr>
    <tr class="row-odd">
        <td class="stats_left">Home Directory</td>
        <td class="stats_right">/home/abc</td>
    </tr>
    <tr class="row-even">
        <td class="stats_left">Last login from</td>
        <td class="stats_right">22.32.232.223&nbsp;</td>
    </tr>
    <tr class="row-odd">
        <td class="stats_left">Disk Space Usage</td>
        <td class="stats_right">30.2 / &#8734; MB<br>
        <div class="stats_progress_bar">
        <div class="cpanel_widget_progress_bar" title="0%"
            style="position: relative; width: 100%; height: 100%; padding: 0px; margin: 0px; border: 0px">
        </div>
        <div class="cpanel_widget_progress_bar_percent" style="display: none">0</div>
        </div>
        </td>
    </tr>
    <tr class="row-even">
        <td class="stats_left">Monthly Bandwidth Transfer</td>
        <td class="stats_right">0 / &#8734; MB<br>
        <div class="stats_progress_bar">
        <div class="cpanel_widget_progress_bar" title="0%"
            style="position: relative; width: 100%; height: 100%; padding: 0px; margin: 0px; border: 0px">
        </div>
        <div class="cpanel_widget_progress_bar_percent" style="display: none">0</div>
        </div>
        </td>
    </tr>
</tbody>
  </table>

「HTML::TreeBuilder」を使用して「DiskUsagespace」の値を見つけるにはどうすればよいですか。上記のコードと同じクラスのtdsがたくさんあります。

4

1 に答える 1

4

<td>一致するコンテンツ(この場合は「ディスク容量の使用量」)を含むを見つけてから、次を見つけます<td>

要素ツリーができたら:

my $usage = $t->look_down(
    _tag => 'td',
    sub {
        $_[0]->as_trimmed_text() =~ /^Disk Space Usage$/
    }
)->right()->as_trimmed_text();

look_down一致するものが見つからない場合に備えて、それをevalブロックでラップすることをお勧めします。

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();
}

これにより、ハッシュにテーブル要素が入力されます。

値を1つだけにする場合は、ループをまったく使用しないでください。 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();
于 2012-09-27T07:41:07.010 に答える