我想提取HTML页面中特定表格单元格中存在的一些文本。
现在,问题是,此单元格存在于没有 ID/Name 的表标记中。
我正在使用 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。
谢谢。
如果在 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>
mirod 方法应该适合你。
但是如果您需要文本内容,我建议使用findvalues
而不是findnodes
。
尝试运行此代码并显示输出:
my @values=$tree->findvalues(q{//table[8]//tr[1]//td});
print $_, "n" foreach(@values);