使用WWW :: Mechanize获取<a> within that tag</a>时获取文本

时间:2010-09-10 21:25:43

标签: perl html-parsing perl-module

我是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

2 个答案:

答案 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;

<强>资源