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>
答案 0 :(得分:1)
使用Web::Query。使用其方法find
和text
以及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']
# ]