我目前正在使用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和grokbase这个问题中意识到,如果find
没有匹配任何元素,它会返回(如果我得到它)正确地)启动find
的DOM对象集合和一个空的DOM集合,这恰好是结果。
我想过使用each
来获取其中的空DOM集合,但是返回的DOM是否包含初始DOM结构?
我已尝试使用if (defined($divVideo))
,我也尝试使用print Dumper($divVideo)
进行转储。它返回的全部是$VAR1 = bless( [], 'Mojo::Collection' );
我尝试$dom->find('div#searchforme')->size
,返回值为0
,即使对于那些不属于此类别的网页也是如此。
有人可以帮帮我吗?
我的做法是错误的吗?
答案 0 :(得分:1)
如果find没有匹配任何元素,它返回(如果我正确的话)启动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 ) {
...
}
或者,如果您希望找到一个这样的元素(看起来你好像在这里做),那么你可以从集合中选择第一个项目,就像这样
{{1}}