2016-03-03 29 views
1

我想抓取内部网站上的所有链接使用WWW :: Mechanize :: Firefox。该网站通过JavaScript加载一些内容,因此我必须先点击同一个类的某些元素“展开”。该网站的结构是这样的:WWW :: Mechanize :: Firefox点击一个类的所有图像

<table> 
    <tr> 
    <td> 
    <a id="xyz" href="somesite"> Content </a> 
    </td> 
    </tr> 
    <tr> 
    <td> 
     <div> 
     <a id="twistie" onclick="expand_this"> 
      <img class="expand" border="0" width="13" height="13" alt="Show All" title="Show All" src="images/plus.gif"> 
     </a> 
     </div> 
    </td> 
    </tr> 
</table> 

点击图片加载更多内容在div容器中。在这个网站上,这些类的图片有多个展开,我必须单击它们才能访问所有内容。这是我失败的地方。

我迄今为止尝试:

$mech->click({ xpath => '//img[@class="expand"]', synchronize => 0 }); 

这只会点击第一个图像元素。

my @images = $mech->xpath('//img[@class="expand"]', synchronize => 0); 

返回尽可能多的数组元素,因为我可以在我的页面上手动计数。不过,如何将返回的数组元素插入到点击操作中,我有点遗憾。

我可以

$mech->click({ xpath => '//img[@class="expand"][0]', synchronize => 0 }); 

$mech->click({ xpath => '//img[@class="expand"][1]', synchronize => 0 }); 

打开的第一个元素返回我

No elements found for //img[@class="expand"][1] at (eval 1377)[/usr/share/perl/5.18/perl5db.pl:732] line 2. 

我试图进一步这一做法:

foreach my $id (0 .. scalar @images) { 
    print $id, "\n"; 
    $mech->click({ xpath => qq(//img[\@class="expand"]["$id"]), synchronize => 0 }); 

} 

但这并没有打开任何元素(不知道为什么)。

我在这里错过了什么吗?点击一个共享类的所有img标签,我需要做些什么,因为这些图片不幸遗漏了一个id?

回答

1

你已经有Perl数组和图像对象了 - 只是遍历它,而不是让机器人迭代它的集合。

foreach (@images) { $mech->click($_) } 
+0

谢谢您的建议!我已经尝试了这种方法,但在第一次点击后,程序挂起。我想我必须再次同步点击,但尝试'$ mech-> click($ plusses [0],{synchronize => 0});'在我的调试器中也挂起了。 – yulivee

相关问题