【问题标题】:Perl HTML::Treebuilder XPATH Table Tags with no ID/Name没有 ID/名称的 Perl HTML::Treebuilder XPATH 表标签
【发布时间】:2012-08-11 11:58:10
【问题描述】:

我想提取 HTML 页面中特定表格单元格中存在的一些文本。

现在,问题是,这个单元格存在于一个没有 ID/名称的表格标签中。

我正在使用 HTML::TreeBuilder::XPath 通过 XPATH 表达式提取值。

HTML 内容如下所示:

<table border="0">
<tr>
<td>Some Text</td>
<td>The Text I want comes here</td>
</tr>

这就是我的 XPATH 表达式的样子:

@nodes=$tree->findnodes(q{//table[8]/tr/td[2]/text()});
print $_->string_value."\n" foreach(@nodes); # corrected, thanks mirod.

它不显示输出。

我用过,上面的table[8],因为这是HTML页面中的8个table标签(假设索引从1开始)。

另外,我使用了 td[2],因为我想要第二个 td 标记之间的 innerHTML。

谢谢。

【问题讨论】:

    标签: perl xpath


    【解决方案1】:

    mirod 方法应该适合你。

    但如果您需要文本内容,我建议使用findvalues 而不是findnodes

    尝试运行这段代码并显示输出:

    my @values=$tree->findvalues(q{//table[8]//tr[1]//td});
    print $_, "\n" foreach(@values);
    

    【讨论】:

      【解决方案2】:

      如果在 XPath 查询末尾删除 text() 会发生什么?我认为在 td 本身上调用 string_value 就足够了。

      另外,方法调用没有插入到字符串中,所以你需要写print $_-&gt;string_value, "\n"

      这将为您提供内容的文本,而不是标记。为此,您需要使用as_HTML,并去除外部标签(HTML::Element 中没有提供内部 HTML 的方法):

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      use HTML::TreeBuilder::XPath;
      
      my $tree= HTML::TreeBuilder::XPath->new_from_content( <DATA>);
      
      my @nodes=$tree->findnodes(q{//table[1]/tr/td[2]});
      print $_->string_value, "\n" foreach(@nodes); # text
      print $_->as_HTML, "\n" foreach(@nodes);      # outerHTML
      
      
      
      __DATA__
      <html>
      <body>
      <table border="0">
      <tr>
      <td>Some Text</td>
      <td>The Text I want comes here with <b>nested</b> content</td>
      </tr>
      </body>
      </html>
      

      【讨论】:

      • 嗨。它不适合我。我也使用了你的方法。我使用索引 table[8] 是否正确,因为它是 HTML 文档中的第 8 个 table 标记?我的 HTML 文档中有多个表格标签,我只能访问其中一个。
      • 是的,table[8] 应该没问题。确保tabletr之间没有多余的tbody,甚至可以使用//table[8]//td[2]
      • 谢谢。我也试过了。它仍然行不通。有没有办法将 HTML 页面发送给您,以便您尝试?我会准确地告诉我需要提取什么。请告诉我,谢谢。
      • 我能够用 HTML::TableExtract 弄清楚。使用表的深度和计数作为 (1,1),我可以提取所有字段 :) 但是,如果我们可以使用 XPath 做同样的事情,那就太好了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2021-07-05
      • 1970-01-01
      • 2017-12-26
      • 2013-02-02
      相关资源
      最近更新 更多