用于表的Perl HTML Parser

时间:2012-07-02 21:20:07

标签: html perl parsing html-parsing

HTML有很多不同的解析器,很难选择严格的解析器。

我的任务是阅读网址并找到具有特定 ID <table>,然后解析此表格的所有<tr>行以获取内容(文字),以及<a>标记内的<img>个链接和<td>图片。

我还需要检查每个行元素的,以便将数据排序到类别。

什么是我最好的选择,哪个库以及我应该使用哪些方法来快速获得结果?


我要解析的部分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 个答案:

答案 0 :(得分:1)

使用Web::Query。使用其方法findtext以及attr

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']
# ]