2

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

任何帮助都感激不尽!

禅宗

4

2 回答 2

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>(或者您确定停止点)处停止。

于 2010-09-10T22:36:12.053 回答
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;

资源

于 2010-09-10T21:31:57.860 回答