2012-08-15 47 views
1

我想提取一些文本,该文本存在于HTML页面中的特定表格单元格中。Perl HTML :: Treebuilder XPATH无标识/名称的表标记

现在,问题是,此单元存在于没有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。

谢谢。

回答

3

如果在XPath查询结束时删除text(),会发生什么情况?我认为在td上调用string_value就足够了。

另外方法调用不是插入字符串,所以你需要编写print $_->string_value, "\n"

这会给你的内容的文字,而不是标记。对于您将需要使用as_HTML,并剥去外层标签(有在HTML ::元素没有一种方法,让你内在的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> 
+0

嗨。它不适合我。我也使用了你的方法。我是否正确使用索引表[8],因为它是HTML文档中的第8个表格标签?在我的HTML文档中有多个表格标签,我只能访问其中的一个。 – 2012-08-15 11:02:25

+0

yeas,'table [8]'应该没问题。确保'table'和'tr'之间没有额外的'tbody',甚至可以使用'// table [8] // td [2]' – mirod 2012-08-15 11:08:19

+0

谢谢。我也尝试过。它仍然无法工作。有没有办法向您发送HTML页面,以便您可以尝试?我会准确地告诉我需要提取什么。请让我知道,谢谢。 – 2012-08-15 11:27:17

1

的mirod方法应该为你工作。

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

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

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