我是Perl-HTML的新手。我正在尝试从HTML表中获取文本和链接。
这是HTML结构:
<td>Td-Text
<br>
<a href="Link-I-Want" title="title-I-Want">A-Text</a>
</td>
我已经发现 WWW::Mechanize 是从<a>
部分获取所需内容的最简单的模块,但我不知道如何获取文本来自<td>
。我希望这两个任务背靠背发生,因为我需要将每个单元格的<td>-Text
与其对应的<a>-Text
配对在哈希数组中。
非常感谢任何帮助!
Z.Zen
答案 0 :(得分:5)
WWW::Mechanize擅长提取链接,但如果您需要获取其他文字,我通常会将其与HTML::TreeBuilder结合使用。像这样:
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_content($mech->content);
foreach my $td ($tree->look_down(_tag => 'td')) {
# If there's no <a> in this <td>, then skip it:
my $a = $td->look_down(_tag => 'a') or next;
my $tdText = $td->as_text;
my $aText = $a->as_text;
printf("td-text: %s\n a-text: %s\nhref: %s\ntitle: %s\n",
$tdText, $aText, $a->attr('href'), $a->attr('title'));
}
此代码的唯一问题是您不希望<td>
标记中的所有文本。你如何解决这个问题取决于你。如果$aText
足够独特,您可以执行以下操作:
$tdText =~ s/\Q$aText\E.*//s;
在最坏的情况下,你必须编写自己的函数来提取你想要的文本元素,停在<br>
(或者你确定停止点)。
答案 1 :(得分:0)
我发现HTML :: TreeBuilder是解析HTML文档和从中提取信息的好方法。在这种情况下,例如:
use HTML::TreeBuilder;
my $page = get($URL);
my $tree = HTML::TreeBuilder->new_from_content($page);
foreach my $cell ($tree->look_down(_tag => "td")) {
my $links = $cell->extract_links();
foreach my $link (@$links) {
print "href: ", $link->attr("href"), "; text: ", $link->as_text, "\n";
}
}
$tree = $tree->delete;
<强>资源强>