【问题标题】:Fetch <td> text while using WWW::Mechanize to fetch <a> within that <td> tag获取 <td> 文本,同时使用 WWW::Mechanize 在该 <td> 标记中获取 <a>
【发布时间】:2023-03-09 22:57:01
【问题描述】:

我是 Perl-HTML 的新手。我正在尝试从 HTML 表中获取文本和链接。

这是 HTML 结构:

<td>Td-Text
    <br>
    <a href="Link-I-Want" title="title-I-Want">A-Text</a>
</td>

我发现 WWW::Mechanize 是从 &lt;a&gt; 部分获取所需内容的最简单模块,但我不确定如何从 &lt;td&gt; 获取文本.我希望这两个任务背靠背发生,因为我需要将每个单元格的&lt;td&gt;-Text 与其对应的&lt;a&gt;-Text 配对在一个哈希数组中。

任何帮助将不胜感激!

禅宗

【问题讨论】:

    标签: perl html-parsing perl-module


    【解决方案1】:

    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'));
    }
    

    此代码的唯一问题是您不希望 &lt;td&gt; 标记中的所有文本。你如何解决这个问题取决于你。如果$aText 足够独特,您可以执行以下操作:

    $tdText =~ s/\Q$aText\E.*//s;
    

    在最坏的情况下,您必须编写自己的函数来提取所需的文本元素,在 &lt;br&gt; 处停止(或者您确定停止点)。

    【讨论】:

    • 除此之外,我可以推荐search.cpan.org/dist/HTML-TreeBuilder-LibXML,它是 HTML-TreeBuilder 的扩展,它也为程序员提供了 XPath 和 LibXML 的所有功能。我最近经常用它来测试 HTML 页面。
    【解决方案2】:

    我发现 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;
    

    资源

    【讨论】:

    • Ummm ... extract_links 不像你想象的那样工作。返回值是arrayrefs的arrayref,而不是元素的arrayref。
    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多