WWW::Mechanize::Firefox 单击 class 的所有图像
WWW::Mechanize::Firefox clicking all images of a class
我正在尝试使用 WWW::Mechanize::Firefox 抓取内部网站上的所有链接。该站点通过 javascript 加载一些内容,因此我必须首先单击相同 class "expand" 的某些元素。站点结构是这样的:
<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 容器中加载更多内容。在网站上,有多个 class 展开的图像,我必须全部单击它们才能访问所有内容。这是我失败的地方。
到目前为止我尝试过的:
$mech->click( { xpath => '//img[@class="expand"]', synchronize => 0 } );
这只会点击第一个图像元素。
my @images = $mech->xpath( '//img[@class="expand"]', synchronize => 0 );
returns 尽可能多的数组元素,我可以在我的页面上手动计数。但是,我对如何将返回的数组元素插入点击操作有点迷茫。
我可以用
打开第一个元素
$mech->click( { xpath => '//img[@class="expand"][0]', synchronize => 0 } );
但是
$mech->click( { xpath => '//img[@class="expand"][1]', synchronize => 0 } );
returns我
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 });
}
但这不会打开任何元素(不知道为什么)。
我是不是漏掉了什么?我需要做什么才能单击共享 class 的所有 img-tags,因为不幸的是图像缺少 id?
您已经拥有包含图像对象的 Perl 数组 - 只需对其进行迭代,而不是让 mech 对其集合进行迭代。
foreach (@images) { $mech->click($_) }
我正在尝试使用 WWW::Mechanize::Firefox 抓取内部网站上的所有链接。该站点通过 javascript 加载一些内容,因此我必须首先单击相同 class "expand" 的某些元素。站点结构是这样的:
<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 容器中加载更多内容。在网站上,有多个 class 展开的图像,我必须全部单击它们才能访问所有内容。这是我失败的地方。
到目前为止我尝试过的:
$mech->click( { xpath => '//img[@class="expand"]', synchronize => 0 } );
这只会点击第一个图像元素。
my @images = $mech->xpath( '//img[@class="expand"]', synchronize => 0 );
returns 尽可能多的数组元素,我可以在我的页面上手动计数。但是,我对如何将返回的数组元素插入点击操作有点迷茫。
我可以用
打开第一个元素$mech->click( { xpath => '//img[@class="expand"][0]', synchronize => 0 } );
但是
$mech->click( { xpath => '//img[@class="expand"][1]', synchronize => 0 } );
returns我
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 });
}
但这不会打开任何元素(不知道为什么)。
我是不是漏掉了什么?我需要做什么才能单击共享 class 的所有 img-tags,因为不幸的是图像缺少 id?
您已经拥有包含图像对象的 Perl 数组 - 只需对其进行迭代,而不是让 mech 对其集合进行迭代。
foreach (@images) { $mech->click($_) }