0

Webページの一部の次のhtmlコードがあります。

<h2 id="failed_process">Failed Process</h2>
<table border="1">
  <thead>
    <tr>
      <th>
        <b>pid</b>
      </th>
      <th>
        <b>Priority</b>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td id="90"><a href="details.jsp?pid=p_201211162334&refresh=0">p_201211162334</a></td>
      <td id="priority_90">NORMAL</td>
    </tr>
    <tr>
      <td id="91"><a href="details.jsp?pid=p_201211163423&refresh=0">p_201211163423</a></td>
      <td id="priority_91">NORMAL</td>
    </tr>
    <tr>
      <td id="98"><a href="details.jsp?pid=p_201211166543&refresh=0">p_201211166543</a></td>
      <td id="priority_98">NORMAL</td>
    </tr>
  </tbody>
</table>
<hr>

pid 列を抽出する必要があります。出力は次のようになります

pid
p_201211162334
p_201211163423
p_201211166543

「失敗したプロセス」テーブルのテーブル数は 4 です。ただし、問題は、テーブル数を 4 と指定すると、Web ページに失敗したタスクがない場合、次のテーブルに移動して次のテーブルの pid を取得することです。間違ったpidになります。

以下のコードを使用して結果を取得しています。

#!/usr/bin/perl
 use strict; 
 use warnings;
 use lib qw(..);
 use HTML::TableExtract;

 my $content = get("URL");
 my $te = HTML::TableExtract->new(
 headers => [qw(pid)], attribs => { id => 'failed_process' },
 );

 $te->parse($content);

 foreach my $col ($te->rows) {
 print ("\t", @$col), "\n";
 }

しかし、次のエラーが発生します。

Can't call method "rows" on an undefined value 
4

2 に答える 2

1

私のお気に入りの DOM パーサーMojolicious スイートのMojo::DOMを使用すると、次のようになります。

#!/usr/bin/env perl

use strict;
use warnings;
use feature 'say';
use Mojo::DOM;

# instantiate with all DATA lines
my $dom = Mojo::DOM->new(do { local $/; <DATA> });

# extract all first column cells
$dom->find('table tr')->each(sub {
    my $cell = shift->children->[0];
    say $cell->all_text;
});

__DATA__
<h2 id="failed_process">Failed Process</h2>
<table border="1">
    ...

出力:

pid
p_201211162334
p_201211163423
p_201211166543
于 2013-01-07T13:10:06.610 に答える
0

$te->parse($html)次のようなものを追加した後foreach my $table ($te->tables) ..、行を取得できます$table->rowsData::Dumperを使用して分析することもできます$te

于 2013-01-07T10:18:04.727 に答える