perl look_down тег індекс - html, perl

Я намагаюся отримати текст тільки в другому лі.

 <ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new;
$tree->parse($url);

foreach my $ul ($tree->look_down(_tag => "ul", class => "threads")){
foreach my $li ($ul->look_down(_tag => "li")){
print $li->as_text. "n";
}
}

Відповіді:

0 для відповіді № 1

Його легко з https://metacpan.org/pod/HTML::TreeBuilder::XPath

#!/usr/bin/perl --
use strict; use warnings;
use HTML::TreeBuilder::XPath;

my $html = q{<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>};


my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_content( $html );
for my $sec ( $tree->findnodes( q{    //ul[@class="threads"]/li[2]    } ) ){
$sec->dump;
}
__END__
<li> @0.1.0.1
"two"
<li> @0.1.1.1
"two"
<li> @0.1.2.1
"two"

Це допоможе вам, якщо ви ще не знаєте xpath: Htmltreexpather.pl - помічник xpath, створює рядки пошуку xpath з html ($ VERSION = 20120112)


0 для відповіді № 2

Ось один спосіб зробити це. Ця програма спочатку знаходить все ul елементи з a threads атрибут класу. Тоді все li для кожного з них знайдені нащадки, а другі - як текст

use strict;
use warnings;
use 5.010;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_file(*DATA);

for my $ul ($tree->look_down(_tag => "ul", class => "threads")) {
my @li = $ul->find("li");
say $li[1]->as_trimmed_text;
}

__DATA__
<html>
<head>
<title>Page title</title>
<head>
<body>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
<p>para</p>
</ul>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
<ul class="threads">
<li>one</li>
<li>two</li>
<li>three</li>
</ul>
</body>
</html>

вихід

two
two
two

Альтернативно

Ось альтернативне, більш лаконічне рішення HTML::TreeBuilder::XPath

Зауважте, що я пропустив DATA розділ, який є таким же, як і вище

use strict;
use warnings;
use 5.010;

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder->new_from_file(*DATA);

for my $li2 ( $tree->findnodes("//ul[@class="threads"]/li[2]") ) {
say $li2->as_trimmed_text;
}

Вихідні дані ідентичні вихідному коду