Как узнать, возвращает ли Perl Mojo::DOM::find или соответствует какой-либо элемент DOM

В настоящее время анализирую серию веб-страниц с Mojo::DOM и единственный критерий для перехода по веб-странице - наличие элемента внутри.

У меня есть мой объект DOM, построенный так:

my $urlMJ = Mojo::URL->new($entry->link);
my $tx = $ua->get($urlMJ);
my $base = $tx->req->url;
my $dom = $tx->res->dom;
my $divVideo = $dom->find('div#searchforme');

Мой вопрос, как я могу знать, если $divVideo пустой?

Я понимаю, что из этого вопроса о группах Google и Grokbase ответил SRI (Riedel), если find не соответствует ни одному элементу, он возвращает (если я правильно понял) коллекцию объектов DOM, инициирующую find и пустая коллекция DOM, которая является результатом.

Я думал об использовании each добраться до пустой коллекции DOM внутри, но разве DOM не будет содержать исходную структуру DOM?

Я пытался использовать if (defined($divVideo)) Я тоже пробовал сбрасывать с print Dumper($divVideo), Все это вернулось $VAR1 = bless( [], 'Mojo::Collection' );

Я старался $dom->find('div#searchforme')->size, возвращаемые значения были 0 и даже для тех веб-страниц, которые не попадают в эту категорию.

Может кто-нибудь помочь мне?

Мой подход к этому неверен?

1 ответ

Решение

если find не соответствует ни одному элементу, он возвращает (если я правильно понял) коллекцию объектов DOM, инициирующую поиск, и пустую коллекцию DOM, которая является результатом.

Вы недоразумение find, Возвращает только Mojo::Collection из Mojo::DOM объекты, которые представляют каждый соответствующий элемент на странице. Ничего больше. Поэтому, если совпадений не найдено, возвращается пустая коллекция.

Этот объект имеет size метод, так что вы можете сказать

my $divColln = $dom->find('div#searchforme');

if ( $divColln->size > 0 ) {
    ...
}

В качестве альтернативы вы можете использовать each метод, чтобы преобразовать коллекцию в список, и назначить ее массиву, как это

my @divColln = $dom->find('div#searchforme')->each;

if ( @divColln ) {
    ...
}

Или, если вы ожидаете найти только один такой элемент (который, похоже, вы делаете здесь), вы можете просто выбрать первый элемент из коллекции, например, так:

my $divVideo = $dom->find('div#searchforme')->[0];

if ( $divVideo ) {
    ...
}
Другие вопросы по тегам