我编写了以下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”引用,因此在打印出这些列的结果时是空白的。
如何为特定搜索考虑多个值?
答案 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 ;