使用Perl解析html适用于2行而不是多行

时间:2011-10-07 15:34:05

标签: html perl

我编写了以下Perl脚本 -

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new_from_content(<<END_HTML);

<span class=time>1 h </span> 
<a href="http://foo.com/User">User</a>: There are not enough <b>big</b>
<b>fish</b> in the lake ;
END_HTML

my $source   = "foo";
my @time     = "10-14-2011";
my $name     = $html->find('a')->as_text;  
my $comment  = $html->as_text;
my @keywords = map { $_->as_text } $html->find('b');

哪个输出 - foo, 10-14-2011, User, 1h User: There are not enough big fish in the lake, big fish 哪个是完美的,我想从测试html但是 这只能在我输入上述HTML时才能正常工作,我将其用于测试目的。

但是,完整的HTML文件对实例有多个“a”和“b”引用,因此在打印出这些列的结果时是空白的。

如何为特定搜索考虑多个值?

1 个答案:

答案 0 :(得分:0)

如果没有真正的HTML,很难提供帮助,但$html->find会返回<a>元素的列表,因此您可以编写类似

的内容
foreach my $anchor ($html->find('a')) {
  print $anchor->as_text, "\n";
}

但是会找到所有 <a>元素,而这不太可能是你想要的。 $ html-&gt; look_down()更灵活,并提供按属性和标签名称搜索。

我无法在没有看到您正在处理的数据的情况下开始猜测您的评论问题。


如果您需要独立处理每个文本元素,那么您可能需要调用objectify_text方法。这会将树中的每个文本元素转换为具有~text标记名称和text属性的伪元素,例如<p>paragraph text</p>将转换为<p><~text text="paragraph text" /></p>。可以使用$html->find('~text')正常发现这些元素。这是一些演示

的代码
use strict;
use warnings;

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new_from_content(<<END_HTML);

<span class=time>1 h </span> 
<a href="http://foo.com/User">User</a>: There are not enough <b>big</b>
<b>fish</b> in the lake ;
END_HTML

$html->objectify_text;
print $_->attr('text'), "\n" for $html->find('~text');

<强>输出

1 h 

User
: There are not enough 
big

fish
 in the lake ;