Perl HTML :: Treebuilder XPATH表标签没有ID /名称

时间:2012-08-15 06:40:52

标签: perl xpath

我想提取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.

它不显示输出。

我上面使用了表[8],因为这是HTML页面中的八个表标记(假设索引从1开始)。

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

感谢。

2 个答案:

答案 0 :(得分:3)

如果在XPath查询结束时删除text()会怎样?我认为在td上调用string_value就足够了。

方法调用也不以字符串形式插入,因此您需要编写print $_->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>

答案 1 :(得分:1)

mirod方法应该适合你。

但如果您需要文字内容,我建议您使用findvalues代替findnodes

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

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