如何知道Perl Mojo :: DOM :: find是否返回或匹配任何DOM元素

时间:2016-01-18 13:51:29

标签: html perl dom mojolicious

我目前正在使用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 groupsgrokbase这个问题中意识到,如果find没有匹配任何元素,它会返回(如果我得到它)正确地)启动find的DOM对象集合和一个空的DOM集合,这恰好是结果。

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

我已尝试使用if (defined($divVideo)),我也尝试使用print Dumper($divVideo)进行转储。它返回的全部是$VAR1 = bless( [], 'Mojo::Collection' );

我尝试$dom->find('div#searchforme')->size,返回值为0,即使对于那些不属于此类别的网页也是如此。

有人可以帮帮我吗?

我的做法是错误的吗?

1 个答案:

答案 0 :(得分:1)

  

如果find没有匹配任何元素,它返回(如果我正确的话)启动find的DOM对象集合和一个空的DOM集合,这恰好是结果。

你误解了find。它返回 Mojo::Collection Mojo::DOMsize个对象,代表页面中的每个匹配元素。没有其他的。因此,如果未找到匹配项,则只返回一个空集合

此对象具有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 ) {
    ...
}

或者,如果您希望找到一个这样的元素(看起来你好像在这里做),那么你可以从集合中选择第一个项目,就像这样

{{1}}