如何知道 Perl Mojo::DOM::find returns 或匹配任何 DOM 元素

How to know if Perl Mojo::DOM::find returns or matches any DOM Element

我目前正在用 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 是否为空?

我从 SRI (Riedel) 回答的关于 google groups and grokbase 的这个问题中了解到,如果 find 不匹配任何元素,它 returns (如果我正确理解的话) ) DOM 对象集合启动 find 和一个空的 DOM 集合,这恰好是结果。

我想过使用 each 来获取其中的空 DOM 集合,但是 DOM returned 不会包含初始的 DOM 结构?

我试过用if (defined($divVideo)),我也试过用print Dumper($divVideo)转储。所有 returned 都是 $VAR1 = bless( [], 'Mojo::Collection' );

我试过 $dom->find('div#searchforme')->size , return 值是 0 甚至对于那些不属于这一类别的网页也是如此。

有人可以帮帮我吗?

我的做法是错误的吗?

if find doesn't match any element, it returns (if I get it correctly) the DOM object collection initiating the find and an empty DOM collection, which happens to be the result.

你误会了find。它 returns 只是 Mojo::CollectionMojo::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 ) {
    ...
}