【问题标题】:Grep and Extract Data in PerlPerl 中的 Grep 和提取数据
【发布时间】:2011-02-22 14:13:48
【问题描述】:

我将 HTML 内容存储在一个变量中。如何提取页面中一组常见标签之间的数据?例如,我对数据感兴趣(由 DATA 表示,保存在一组标签之间,一行接一行:

...
<td class="jumlah">*DATA_1*</td>
<td class="ud"><a href="">*DATA_2*</a></td>
...

然后我想将映射 DATA_2 => DATA_1 存储在哈希中

【问题讨论】:

    标签: html perl tags grep extract


    【解决方案1】:

    既然是 HTML,我认为这对你有用吗?

    https://metacpan.org/pod/XML::XPath

    XPath 是一种方式。

    【讨论】:

    • XPATH 是否仅限于 XML(因此仅限于 XHTML)?我对它的经验非常有限,但从未见过它用于处理非 X HTML
    • @DVK:我不会把它放在一个用 Perl 开发的 XPath 模块来尝试更聪明一点。
    • 在使用 XPath 查询 HTML 文档时,我一直使用 HTML::TreeBuilder::XPath 库 (search.cpan.org/~mirod/HTML-TreeBuilder-XPath-0.11/lib/HTML/…)。据我所知,它非常强大(我已经使用它从某些网站上抓取了数万个营业地点)。
    • 我想把 HTML::TreeBuilder::XPath 链接给你,但是从谷歌复制链接时我弄错了。对不起。
    【解决方案2】:

    使用答案 to this Q - HTML::TreeBuilder 或 HTML::Parser 中描述的 HTML 解析模块。

    纯粹从理论上讲,您可以尝试使用正则表达式来执行此操作,但正如链接问题的答案和无数次在 SO 上所指出的那样,使用 RegEx 解析 HTML 是一个大写字母的坏主意 - 太容易出错了由于 HTML 不是常规语言,因此很难康复,而且不可能 100% 正确。

    【讨论】:

    • 理论上可能是不可能的 - HTML 不是常规语言。如果他的查询是“常规的”,那是有可能的。
    【解决方案3】:

    您可以试试这个模块:HTML::TreeBuilder::XPath。医生说:

    该模块将典型的 XPath 方法添加到 HTML::TreeBuilder,以便于查询文档。

    【讨论】:

      【解决方案4】:

      由于它是 HTML,您可能希望 XPath 模块用于处理 HTML,HTML::TreeBuilder::XPath

      首先,您需要使用 HTML::TreeBuilder 方法解析字符串。假设您的网页内容位于名为 $content 的变量中,请执行以下操作:

      my $tree = HTML::TreeBuilder->new;
      $tree->parse_file($file_name);
      

      现在您可以使用XPath 表达式在您关心的节点上获取迭代器。第一个表达式获取 table 中的 table 中的 html 元素中的所有 td 节点:

      my $tdNodes = $tree->findnodes('/html/body/table/tr/td');
      

      最后你可以在一个循环中遍历所有节点来找到你想要的:

      foreach my $node ($tdNodes->get_nodelist) {
        my $data = $node->findvalue('.'); // the content of the node
        print "$data\n";
      }
      

      有关其方法的更多信息,请参阅HTML::TreeBuilder 文档,有关如何使用 NodeSet 结果对象的信息,请参阅NodeSet 文档。 w3schools 有一个可以通过的 XPath 教程here

      有了这一切,您应该能够进行非常健壮的 HTML 解析来抓取您想要的任何元素。您甚至可以在 XPath 查询中指定类、id 等,以便真正具体地确定您想要哪些节点。在我看来,使用这个修改后的 XPath 库解析 HTML 比处理一堆一次性的正则表达式要快得多且更易于维护。

      【讨论】:

        猜你喜欢
        • 2015-06-11
        • 2011-04-07
        • 2011-12-02
        • 2014-07-21
        • 2012-05-07
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多