2012-08-01 24 views
3

我不得不说我是Perl的新手,可能已经制作了大约3或4个脚本,而且我发现Perl很容易理解和使用。Perl使用WWW :: Mechanize设置一个没有任何价值的单选按钮

不管怎样,我的当前脚本有问题。我一直被困在这个问题上,似乎无法找到解决办法。

遍历某个网站后,我来到一个页面,让我点击两个单选按钮并点击下载按钮。

我需要让我的脚本选择任一按钮并点击下载,但页面的源并没有给我一个值来设置单选按钮时使用WWW::Mechanize

这里是一些网页源代码。

<input type='radio' onclick="url('URL GOES HERE')"> 

这对于两个按钮来说非常相似。我注意到,当我选择了一个看着源,代码就会变为

<input type='radio' checked onclick="url('URL GOES HERE')"> 

但我不能有WWW::Mechanize设定一个自动,因为我不知道该放在什么价值。我试过on,checked,onclick,true,checked onclick,select,selected,但无济于事。

这里是代码行,涉及到这个

$mech->set_visible([radio => 'checked onclick']); 

任何帮助,将不胜感激,第一次在这里。

我忘了提及我现在在工作中有很多限制的计算机。所以我无法在电脑上安装Firefox或Selenium Server。

编辑

我相信,我可能也有问题的是,这东西可能是在JavaScript中。我对HTML没有多少了解,但是源代码看起来像是这样,直到我在标题的某处看到JavaScript?无论如何,我记得WWW::Mechanize并不真的支持JavaScript,所以也许这是问题所在。

感谢回复的家伙,我真的很感激它。但经过大量的仔细检查后,我的老板和我意识到所有的下载链接都非常相似,我真正需要做的就是让脚本自定义创建链接到下载,而不是通过taversing多个网页的麻烦。希望我更早看到这一点。

+0

我是Perl的WWW :: Mechanize的忠实粉丝,但在这种情况下,我想你可能会使用Python机械化获得更多运气。看看这个相关的[问题和答案](http://stackoverflow.com/questions/3798138/how-to-select-a-radio-button)。 – David 2012-08-01 22:38:24

+0

你的单选按钮没有'name'属性吗? – Borodin 2012-08-01 22:43:03

+0

@Borodin单选按钮通常使用相同的名称,因此它们是互斥的。也就是说,当您选择一个名称时,将取消选择具有相同名称的所有其他名称。因此,为了检查每个单选按钮的设置,您需要使用某种索引来引用它们,因为它们都共享相同的名称。 Python机械化支持这一点,但Perl的WWW :: Mechanize不支持。 – David 2012-08-01 22:53:10

回答

0

您需要在浏览器GUI中选择您的单选按钮后查找会发生什么情况。有两种方法是:

  1. 您可以检查URL()投票子程序

  2. ,或者你提交目标表单后,您可以记录您的浏览器请求。

我建议为此使用Firefox的HTTPFox扩展。所以你只需选择你的输入,在HTTPFox中启动会话并提交表单。接下来,检查已发布(或已获取)的数据,并在您的Mechanize脚本中复制相同的字段 。例如:

$mech->submit_form(
    form_name => "form_name", 
    fields => { 
     input1_name => "value1", 
     input2_name => "value2", 
..... 
    }, 
); 
1

HTML::Form不提供API来激活未命名的单选按钮。你可以通过挖掘内脏来阅读区分属性。这应该工作(主要是未经测试):

use WWW::Mechanize qw(); 
my $w = WWW::Mechanize->new; 
$w->get('file:///tmp/so11767998.html'); 
for my $input (($w->forms)[0]->inputs) { 
    $input->check if q{url('URL GOES HERE')} eq $input->{onclick} 
} 
-1

我也有这个问题,并通过调用Javascript来解决它,单击单选按钮。

$mech->eval_in_page('document.getElementById("id_radiobutton").checked = true;'); 

这对我有效。

相关问题