无法使用Mojo :: DOM定位模块

时间:2015-06-17 21:37:37

标签: perl dom mojolicious mojo

我是Mojolicious的新手。我确信这可能是一个设置问题,但它耗尽了我一整天的时间。我正在尝试运行这个简单的测试代码

#!/usr/bin/perl

use strict;
use warnings;
use Mojo::DOM;
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new();

$ua->get('https://stackoverflow.com/questions/26353298/find-links-containing-bold-text-using-wwwmechanize')->res->dom('a div')->ancestors('div.spacer')->each( sub { say $_->all_text } );

我在这个位置找到了

find links containing bold text using WWW::Mechanize

并且

失败了
Can't locate object method "ancestors" via package "Mojo::Collection" at ./test4.pl line 10.

我已经卸载并重新安装了数十万次,尝试了不同的软件包安装选项(cpan,cpanm,直接链接等)。没有骰子。我有点困惑的是Mojo :: Collection模块似乎没有“祖先”方法(继承或没有),但我看到其他几个例子似乎以相同的方式使用相同的方法。它不仅仅是“祖先”模块 - 问题似乎也影响了其他一些方法。

我在Linux Mint上使用perl 5.18.2和Mojolicious包6.11。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

调试像这样的单个长链语句是非常困难的,并且你将它分成单独的步骤要好得多

将参数传递给dom方法与在DOM对象上使用该参数调用find相同。 find返回Mojo::Collection,这是有意义的,因为它是与CSS选择器匹配的节点集。 ancestors方法仅适用于单个节点,因此您必须使用firstlast选择一个,或使用each一次处理一个

这是对代码的重写,它产生了我认为是预期结果的代码

use strict;
use warnings;
use 5.010;

use open qw/ :std :encoding(UTF-8) /;

use Mojo;

my $url = 'http://stackoverflow.com/q/26353298';

my $ua = Mojo::UserAgent->new->max_redirects(3);
my $dom = $ua->get($url)->res->dom;

my $divs = $dom->find('a div');

printf "%d matching div elements:\n\n", $divs->size;

my $n;
for my $div ( $divs->each ) {
  my $spacers = $div->ancestors('div.spacer');
  for my $spacer ( $spacers->each ) {
    printf "%2d -- %s\n\n", ++$n, $spacer->all_text;
  }
}

<强>输出

20 matching div elements:

 1 -- Stack Exchange Podcast #65: The Word Has Two Meanings, You See

 2 -- PIVOTing into a new career: please welcome Taryn Pratt, bluefooted Community …

 3 -- 0 Can't locate module(s) using Mojo::DOM

 4 -- 0 tiny runable www::Mechanize examples for the beginner

 5 -- 2 Perl WWW::Mechanize and authenticated proxy

 6 -- 0 How to process a simple loop in Perl's WWW::Mechanize?

 7 -- 1 not able to click a button in www::mechanize perl

 8 -- 0 Perl - Mechanize? - How to get all links in a page up to a specific “delimiter” text

 9 -- 2 Why am I getting gibberish content using Perl's WWW::Mechanize?

10 -- 1 Getting error in accessing a link using WWW::Mechanize

11 -- 3 Perl WWW::Mechanize Web Spider. How to find all links

12 -- 0 What is the best way to extract unique URLs and related link text via perl mechanize?

13 -- 0 perl WWW::Mechanize file upload error