Web爬虫文本格式

时间:2012-04-06 19:04:03

标签: perl web-crawler html-tree

我有以下代码来访问HTML表格。

my $table = $tree->look_down(_tag => "table", id => "moduleDetail");

然而,文本没有格式化,因为网页使用表格边框来划分某些文本。所以它就像这样,#34;数学计算乔丹斯敦"和jordanstown在一起,我假设在下一个细胞中。这是我正在使用的代码,

my @array; 
my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");




    for ($table ->look_down(_tag => 'tr')) {

                push(@array,$_->as_text());

    }

    foreach(@array){
           print $_, " ";
                    }
$tree->delete();

注意我试图将文本与数组分开,但没有运气?任何指针。谢谢

2 个答案:

答案 0 :(得分:1)

如果在树上调用objectify_text方法,则可以更轻松地访问HTML树的文本节点。这会将文本节点从简单字符串更改为HTML::Element的实例,其伪标记名称为~text,而名为text的属性则等于文本字符串。这允许look_down方法搜索文本节点。

如果你这样重新编码,你将获得推送到数组上的每个单独文本节点的值。

my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
$tree->objectify_text;

my $table = $tree->look_down(_tag => "table", id => "moduleDetail");

my @text; 

for my $tr ($table->look_down(_tag => '~text')) {
  my $text = $tr->attr('text');
  push @text, $text if $text =~ /\S/;
}

print "$_\n" for @text;

答案 1 :(得分:0)

使用HTML :: TreeBuilder :: XPath

我建议使用Perl模块HTML::TreeBuilder::XPath。它应该给你你想要的东西。

从文档中,我相信您的代码看起来像使用XPath模块

my $tree = HTML::TreeBuilder::XPath->new_from_content($mech->content);
my @trArray = $tree->findnodes_as_string( '//table[@id="moduleDetail"]/tr/td');
$tree->delete();

有关XPath的更多信息,请参阅http://www.w3schools.com/xpath/

使用HTML :: TreeBuilder

如果您想坚持使用HTML::TreeBuilder,那么您需要执行以下操作

my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");
for ($table->look_down(_tag => 'td')) {
  push(@array,$_->as_text());   
}