如何使用Mechanize在html文档中搜索文本?

时间:2015-06-08 16:06:14

标签: perl mechanize www-mechanize html-tree

我在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。为了得到它,我必须搜索具有此属性的元素:

  • tag-name是&#34; div&#34;
  • class is&#34; red&#34;
  • 内容为文字&#34;香蕉&#34;

然后我需要得到它的父母(一个<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的本机函数。

1 个答案:

答案 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...
  }

WWW::Mechanize::TreeBuilder