如何在单独的行上打印HTML :: Treebuilder节点的文本内容?

时间:2013-07-28 20:57:52

标签: perl html-parsing perl-module

我正在使用 TreeBuilder :: XPath ,如下所示:

use strict;
use warnings;

use LWP::Simple;
use HTML::TreeBuilder::XPath; 

my $url='file:///C:/Users/Rockstar/workspace/abc/globals_func.html';
my $page = get($url) or die $!;

my $p = HTML::TreeBuilder::XPath->new_from_content( $page);
my @trips= $p->findnodes( '//div[@class="contents"]');
foreach my $trip (@trips){
   print $trip->as_text; 
}

在HTML文件中运行后,我得到了这个输出(ALL在一行中):

  

ChainCtrlBuildChain():ChainController.cChainCtrlDumpChain():ChainController.cChainCtrlExit():ChainController.cChainCtrlGetBitStreamChan():ChainController.cChainCtrlInit():ChainController.c。

但我希望它们显示如下(每个值一行):

ChainCtrlBuildChain() : ChainController.c
ChainCtrlDumpChain() : ChainController.c
ChainCtrlExit() : ChainController.c
ChainCtrlGetBitStreamChan() : ChainController.c
ChainCtrlInit() : ChainController.c.

我的HTML文件(仅显示“内容”的HTML代码):

<div class="contents">
&#160;<ul>
<li>ChainCtrlBuildChain()
: <a class="el"   href="_chain_controller_8c.html#acb2c56087a2072b6445a54c17662d118">ChainController.c</a>
</li>
<li>ChainCtrlDumpChain()
: <a class="el" href="_chain_controller_8c.html#a13ed5a02bf232b115b9a58cdd13dadd7">ChainController.c</a>
</li>
<li>ChainCtrlExit()
: <a class="el" href="_chain_controller_8c.html#a9e30e46ebc5411537efe95a286e27cb4">ChainController.c</a>
</li>
<li>ChainCtrlGetBitStreamChan()
: <a class="el" href="_chain_controller_8c.html#a00faa6e64ea466d4ec57339017e57e71">ChainController.c</a>
</li>
<li>ChainCtrlInit()
: <a class="el" href="_chain_controller_8c.html#aed300a388eff2fa9c7565025982faab1">ChainController.c</a>
</li>
</ul>
</div><!-- contents -->

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您需要在print语句中添加新行。

print $trip->as_text."\n";

或者,您可以使用say自动执行此操作:

use feature 'say';
...
say $trip->as_text;

<强>更新

您正在访问div元素,该元素会在您的数组中为您提供一个元素,其中包含ul的每个元素。要将li的每个元素都放入一个数组元素中,您需要执行以下操作:

use feature 'say';
...
my @trips= $p->findnodes( '//div[@class="contents"]//li');
foreach my $trip (@trips){
   say $trip->as_text; 
}

这将访问li元素。