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