2012-07-02 82 views
0

HTML有很多不同的解析器,因此很難選擇合適的解析器。用於表格的Perl HTML解析器

我的任務是讀網址並找到<table>具體ID,然後解析所有<tr>行此表的內容(文本),也<a>鏈接和內<td>標籤<img>圖像。

我還需要檢查爲每個行元素將數據分類到類別。

什麼是我最好的選擇,我應該使用哪種庫和哪些方法來快速獲取資料?


的HTML代碼的一部分的例子,我想分析:

<table id="t1"> 
    <tr class="r1"> 
    <td class="c1"><a href="..."><img height="50" src="..." width="50" /></a></td> 
    <td class="c2"> 
     <div class="d1"> 
     <ul class="u1"> 
      <li class="l1"><a href="..." rel='...'>text here</a></li> 
      <li class="l2"><a href="..." rel='...'>text here</a></li> 
     </ul> 
     </div> 
     <div class="d2"> 
     <a href="...">text here</a> 
     </div> 
    </td> 
    <td class="c3"> 
     <div ...>...</div> 
     <div class="d2"> 
     <a href="...">text here</a> 
     </div> 
    </td> 
    <td class="c4">text here</td> 
    <td class="c5">text here</td> 
    </tr> 
    ... 
</table> 

回答

1

使用Web::Query。使用其方法findtextattr

use List::Gen qw(mapn); 
use Web::Query 'wq'; 

sub classify { 
    my ($l) = @_; my %r; 
    mapn { push @{ $r{$_[0]} }, $_[1] } 2, @$l; return %r; 
}; 

my $w = wq('file:///tmp/so11301348.html'); 
my %rows = classify $w 
    # find a <table> with specific id 
    ->find('table#t1') 
    # parse all <tr> rows of this table for content (text) 
    # check class for each row element to sort data to categories 
    ->find('tr')->map(sub { 
     my (undef, $tr) = @_; 
     return $tr->attr('class') => $tr->text; 
    }); 
# (
#  '' => [ 
#   ' ... ' 
#  ], 
#  r1 => [ 
#   'text heretext heretext here...text heretext heretext here' 
#  ] 
#) 

my $links_images = $w 
# but also <a> links and <img> images within <td> tags 
->find('td a, td img') 
->map(sub { 
    my (undef, $e) = @_; 
    return $e->attr('src') 
     ? [img => $e->attr('src') => $e->attr('alt')] 
     : [a => $e->attr('href') => $e->text]; 
}); 
# [ 
#  ['a', '...', ''], 
#  ['img', '...', ''], 
#  ['a', '...', 'text here'], 
#  ['a', '...', 'text here'], 
#  ['a', '...', 'text here'], 
#  ['a', '...', 'text here'] 
# ] 
+0

謝謝。我用HTML例子更新了這個問題。 –