Я намагаюся отримати текст тільки в другому лі.
<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;
}
Вихідні дані ідентичні вихідному коду