我想提取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。
感谢。
答案 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);