0

HTML::TableExtractモジュールに関連する投稿が他にもたくさんあることは知っていますが、それらはすべて、現時点で理解できるよりもはるかに高いレベルのものです。電子メールから非常に小さなテーブル (3 行、5 列) があり、2 行目のすべてのデータをスクレイピングしたいと考えています。しかし、Perl に関する知識が限られているため、オンラインのドキュメントをたどるのに苦労しています。

テーブルは次のようになります。

Time      notspam    probablespam    likelyspam    spam
2012-05   10252205   62192           55995         3797710
Total     ""         ""              ""            ""

これが、解析しようとしているコードのスニペットです。これは 3 つの行の 2 番目です。

<tr class=3DmailViewUnreadOdd>

<td  class=3DreportViewHeader align=3D"left">
=09
     2012-05
</td>
=20=20
=20=20=20=20
     <td align=3D'right' class=3D'mailViewRowReadEven'>
10252205
=20=20=20=20
</td>
=20=20
=20=20=20=20
     <td align=3D'right' class=3D'mailViewRowReadEven'>
62192
=20=20=20=20
</td>
=20=20
=20=20=20=20
     <td align=3D'right' class=3D'mailViewRowReadEven'>
55995
=20=20=20=20
</td>
=20=20
=20=20=20=20
     <td align=3D'right' class=3D'mailViewRowReadEven'>
3797710
=20=20=20=20
</td>
=20=20
</tr>

これが私がこれまでに試したことです。HTML::TableExtract ページの例を使用し、必要に応じて変更しました。しかし、それは何も返していません:

use HTML::TableExtract;
my $te = HTML::TableExtract->new(
    headers => [qw(notspam  probablespam  likelyspam  spam)]);
my $html = 'test.html';
$te->parse($html);
# Examine all matching tables
foreach $ts ($te->tables) {
    print "Table (", join(',', $ts->coords), "):\n";
    foreach $row ($ts->rows) {
        print join(',', @$row), "\n";
    }
}

日付 (2012-05) と数字 (10252205、62192、55995、3797710) を取り出して変数に格納したいと考えています。depth および count 引数を使用してデータを抽出する必要がありますか?

4

1 に答える 1

0

これは、サンプルデータで機能します。(完全な電子メールに対して実行すると、キャプチャが多すぎる可能性がありますが、部分的なHTMLのみで実行できるのはそれだけです。)

use strictures;
use File::Slurp qw(read_file);
use MIME::QuotedPrint qw(decode_qp);
use Web::Query qw();

my $w = Web::Query->new_from_html(decode_qp read_file 'so10883053.html');
my @data = $w->find('.mailViewUnreadOdd > *')->text;
# (
#     " 2012-05 ",
#       10252205 ,
#          62192 ,
#          55995 ,
#        3797710
# )

コードで示したように手動の電子メールデコードをいじくり回す代わりに、 Courrielなどの非常に高レベルのパーサーを使用する必要があります。

于 2012-06-04T15:35:51.857 に答える