2012-06-04 13 views
0

我知道many other posts relatedHTML::TableExtract模塊,但他們都比我目前所瞭解的要高得多。我有一個非常小的表(3行,5列)從電子郵件,我想刮在第二行的所有數據。然而,由於我對Perl的瞭解有限,在線上編輯文檔後,我遇到了很多麻煩。如何從引用打印的編碼HTML表格中提取數據?

表看起來是這樣的:

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

[你有什麼嘗試?](http://whathaveyoutried.com) – 2012-06-04 14:45:19

+0

嗯,我原本打算使用HTML:Parse,但後來發現我應該使用HTML:TableExtract。我已經嘗試過使用深度和數量,但我不確定我是否做得對。老實說,我討厭成爲SO上的「那個人」,但我對Perl沒有太多的瞭解。我試圖把所有東西拼湊起來,並隨着我的走向學習。 我想我所發現的是,拉取信息的最好方法是按標題搜索,所以我會尋找「mightspam,likelyspam,spam等」。 –

回答

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

+0

感謝您的幫助daxim。問題是這些數字會定期變化,所以我需要數據的位置,而不是字面值。對不起,我沒有提到這一點。 –

+0

然後[編輯你的問題](http://stackoverflow.com/posts/10883053/edit),並非常具體地說明你的意思是「位置」。解釋如何從示例數據手動到達解決方案。 – daxim

相關問題