Mojo::DOM: как работают спички?

Что мне нужно изменить в приведенном ниже примере, чтобы matches( 'a[rel="next"]' ) возвращал true?

#!/usr/bin/env perl
use warnings;
use strict;
use Mojo::DOM;

my $content = '<html><body><div><a hello="world" rel="next">Next</a></div></body></html>';

my $bool_1 = $content =~ /<a.+?rel="next"/;
print "1 OK\n" if $bool_1;

my $dom = Mojo::DOM->new( $content );
my $bool_2 = $dom->matches( 'a[rel="next"]' );
print "2 OK\n" if $bool_2; # does not print "2 OK"

person sid_com    schedule 18.04.2015    source источник


Ответы (1)


Результатом Mojo::DOM->new( $content ) является весь DOM, представленный разметкой. Начальный элемент всегда является элементом верхнего уровня; в данном случае это html. Естественно, html не соответствует селектору a[rel="next"], и поэтому matches() возвращает false.

Вам нужно перейти к элементу a, используя at() перед его тестированием:

my $dom = Mojo::DOM->new( $content );
my $a = $dom->at( 'a' );
my $bool_2;
if ( defined $a ) {
    $bool_2= $a->matches( 'a[rel="next"]' );
}
print "2 OK\n" if $bool_2;
person BoltClock    schedule 18.04.2015