1

我想提取 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 页面中的八个 table 标记(假设索引从 1 开始)。

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

谢谢。

4

2 回答 2

3

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

此外,方法调用不会插入到字符串中,因此您需要编写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>
于 2012-08-15T09:21:05.950 回答
1

mirod 方法应该适合您。

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

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

my @values=$tree->findvalues(q{//table[8]//tr[1]//td});
print $_, "\n" foreach(@values);
于 2012-08-15T14:45:31.200 回答