Я использую WWW::Mechanize, HTML::TreeBuilder и HTML::Element в своем perl-скрипте для навигации по html-документам.
Я хочу знать, как искать элемент, содержащий определенную строку в виде текста.
Вот пример 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
. Чтобы получить его, мне нужно найти элемент с такими свойствами:
- имя тега "div"
- класс "красный"
- содержание - текст "Банан"
Затем мне нужно получить его родителя (элемент <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-модуля.
WWW::Mechanize
и написать толькоmy $root = HTML::TreeBuilder->new_from_url($uri)
- person Borodin   schedule 09.06.2015