【问题标题】:How to know if Perl Mojo::DOM::find returns or matches any DOM Element如何知道 Perl Mojo::DOM::find 是否返回或匹配任何 DOM 元素
【发布时间】:2016-04-23 17:17:34
【问题描述】:

我目前正在使用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 不匹配任何元素,它会返回(如果我理解正确的话)DOM 对象集合启动find 和一个空的 DOM 集合,这恰好是结果。

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

我尝试过使用if (defined($divVideo)),我也尝试过使用print Dumper($divVideo) 倾倒。它返回的只是$VAR1 = bless( [], 'Mojo::Collection' );

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

有人可以帮帮我吗?

我的处理方法有问题吗?

【问题讨论】:

    标签: html perl dom mojolicious


    【解决方案1】:

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

    你误会find。它返回只是一个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 ) {
        ...
    }
    

    【讨论】:

    • 感谢@Borodin 的快速回复。我打印了$divVideo->size,但它都返回了0 值,即使对于所有具有该元素的网页也是如此
    • 那么要么您的选择器错误,要么您对 HTML 有误。 div#searchforme 查找类似 @​​987654333@ 的元素。您的意思是使用div.searchforme 吗?该页面也有可能部分是使用 JavaScript 构建的,Mojo::UserAgent 不支持。尝试打印 $dom->to_string 以查看 HTML 是否与您认为的一样
    • 你是对的@Borodin,该页面部分是用javascript构建的,当Mojo :: UserAgent获取页面时,这些元素尚未写入。我将使用另一种方法。它实际上是一个 DIV #id。非常感谢。
    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 2012-12-19
    • 2014-03-03
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多