我在perl脚本中使用WWW :: Mechanize,HTML :: TreeBuilder和HTML :: Element来浏览html-Documents。
我想知道如何搜索包含某个字符串作为文本的元素。
以下是html文档的示例:
<html>
<body>
<ul>
<li>
<div class="red">Apple</div>
<div class="abc">figure = triangle</div>
</li>
<li>
<div class="red">Banana</div>
<div class="abc">figure = square</div>
</li>
<li>
<div class="green">Lemon</div>
<div class="abc">figure = circle</div>
</li>
<li>
<div class="blue">Banana</div>
<div class="abc">figure = line</div>
</li>
</ul>
</body>
</html>
我想提取文字square
。为了得到它,我必须搜索具有此属性的元素:
然后我需要得到它的父母(一个<li>
- 元素),并且从父母那里得到的文字的孩子以figure =
开头,但是这个,以及休息,很容易。
我试过这种方式:
use strict;
use warnings;
use utf8;
use Encode;
use WWW::Mechanize;
use HTML::TreeBuilder;
use HTML::Element;
binmode STDOUT, ":utf8";
my $mech = WWW::Mechanize->new();
my $uri = 'http.....'; #URI of an existing html-document
$mech->get($uri);
if (($mech->success()) && ($mech->is_html())) {
my $resp = $mech->response();
my $cont = $resp->decoded_content;
my $root = HTML::TreeBuilder->new_from_content($cont);
#this works, but returns 2 elements:
my @twoElements = $root->look_down('_tag' => 'div', 'class' => 'red');
#this returns an empty list:
my @empty = $root->look_down('_tag' => 'div', 'class' => 'red', '_content' => 'Banana');
# do something with @twoElements or @empty
}
我必须使用什么代替最后一个命令来获取想要的元素?
我不是在找一个解决方法(我找到了一个)。我想要的是WWW :: Mechanize,HTML :: Tree或任何其他cpan-modul的本机函数。
答案 0 :(得分:0)
这是psuedocode / unttested Perl:
my @twoElements = $root->look_down('_tag' => 'div', 'class' => 'red');
foreach my $e ( @twoElements ) {
next unless $e->content_list->[0] eq 'Banana';
my $e2 = $e->right; # get the sibling - might need to try left() depending on ordering
my ($shape) = $e2->content_list->[0] =~ /figure = (.+)/;
# do something with shape...
}
不完美,但它应该让你开始,并且它足够通用,可以轻松重复使用。否则替换
($shape) = $e2->content_list->[0] =~ /figure = (.+)/;
类似
$shape = 'square' if $e2->content_list->[0] =~ /square/;
这可能更清洁一点:
我的@elements = $ root-&gt; look_down('_ tag'=&gt;'div','class'=&gt;'red'); 预告我的$ e(@elements){ 接下来除非$ e-&gt; as_trimmed_text eq'Banana'; 我的$ e2 = $ e-&gt;对; 我的($ shape)= $ e2-&gt; as_trimmed_text =〜/ figure =(。+)/;
# do something with shape...
}