如何从带引号的可打印编码HTML表中提取数据?

时间:2012-06-04 14:31:26

标签: html perl parsing html-table

我知道many other posts related模块有HTML::TableExtract,但所有这些模块都比我目前理解的要高得多。我有一个非常小的表(3行,5列)来自电子邮件,我想刮掉第二行中的所有数据。但是,由于我对Perl的了解有限,我在网上获取文档时遇到了很多麻烦。

表格如下:

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

以下是我要解析的代码片段。这是三行中的第二行:

<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)并将它们存储在变量中。我应该使用深度和计数参数来提取数据吗?

1 个答案:

答案 0 :(得分: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