Как узнать, возвращает ли 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 ) {
...
}