为什么这种情况不起作用?与班级划分

时间:2012-04-06 13:01:24

标签: perl web-crawler

我有一个条件,我想从特定标签中检索文本,但它似乎没有返回true ..任何帮助?

#!/usr/bin/perl

use HTML::TreeBuilder;
use warnings;
use strict;
my $URL = "http://prospectus.ulster.ac.uk/modules/index/index/selCampus/JN/selProgramme/2132/hModuleCode/COM137";
my $tree = HTML::TreeBuilder->new_from_content($URL);  

if (my $div = $tree->look_down(_tag => "div ", class => "col col60 moduledetail")) {
 printf $div->as_text();
          print "test";
 open (FILE, '>mytest.txt');
 print FILE $div;
 close (FILE); 
}
      print $tree->look_down(_tag => "th", class => "moduleCode")->as_text();
 $tree->delete();

它没有进入if语句,并且if语句之外的print表示存在未定义的值,但我知道它应该返回true,因为这些标记确实存在。

<th class="moduleCode">COM137<small>CRN: 33413</small></th>

感谢

1 个答案:

答案 0 :(得分:3)

您正在呼叫HTML::TreeBuilder->new_from_content,但您提供的是网址而不是内容。您必须先get HTML,然后才能将其传递给HTML::TreeBuilder

也许最简单的方法是使用LWP::Simple导入一个名为get的子程序。这将读取URL上的数据并将其作为字符串返回。

从不执行条件块的原因是标签名称中有空格。您需要"div"而不是"div "

另请注意以下事项:

  • 您不应使用printf输出单个字符串,并将该字符串作为格式说明符。它可能会生成缺少参数警告,并且无法正确输出字符串。

  • 理想情况下,您应该使用词法文件句柄和open的三参数形式。您还应该检查所有open来电的状态并做出相应的回应。

  • 您的标量变量$div是一个受祝福的哈希引用,因此按原样打印它将输出类似HTML::Element=HASH(0xfffffff)的内容。您需要调用其方法来提取要显示的值

修正了这些错误后,您的代码看起来像这样,虽然我没有格式化输出,因为我无法告诉您想要什么。

use strict;
use warnings;

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

my $url = "http://prospectus.ulster.ac.uk/modules/index/index/selCampus/JN/selProgramme/2132/hModuleCode/COM137";
my $html = get $url;
my $tree = HTML::TreeBuilder->new_from_content($html);  

if (my $div = $tree->look_down(_tag => "div", class => "col col60 moduledetail")) {
  print $div->as_text(), "\n";
  open my $fh, '>', 'mytest.txt' or die "Unable to open output file: $!";
  print $fh $div->as_text, "\n";
}

print $tree->look_down(_tag => "th", class => "moduleCode")->as_text, "\n";