3

我正在尝试使用WWW::Mechanizeperl 模块通过 post 方法提交表单。

use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
...
$mech->get($url);
...
my $response = $mech->submit_form(
        form_name => $name,
        fields    => {
                        $field_name => $field_value
                         },
        button    => 'Button'  
    );

$field_name一般来说是一个文本字段(虽然在表单中没有明确指定类型),它有一个预设值。

$field_name => $field_value$mech->submit_form任何原因上都不会替换该值,而是$field_value在原始值之后添加到表单中:

{submitted_field_value} = {original_value},{provided_value}

如何在要提交的表单中{original_value}替换为?{provided_value}

4

3 回答 3

1

如果在调用 $mech->submit_form() 之前将这一行添加到代码中会发生什么:

$mech->field( $name, [$field_value], 1 );

这确保了第一个值被添加,或者如果它已经存在则被覆盖。 1是数字参数(或位置索引)

参见 WWW::Mechanize 的文档:

$mech->field( $name, \@values, $number )

给定一个字段的名称,将其值设置为指定的值。[...]

可选的 $number 参数用于区分具有相同名称的两个字段。字段从 1 开始编号。

于 2012-01-01T10:45:06.930 回答
0

重要的是要记住 WWW::Mechanize 最好被视为“无头浏览器”,而不是说 LWP 或 curl,后者只为您处理所有繁琐的 http 请求。Mech 在您做事时保持其状态。

您需要通过使用$mech->forms或类似的方式获取表单(最好从文档中决定。我的意思是有很多方法可以做到这一点。 ),然后使用字段方法设置要更改的输入字段。

我想这样做的基本方法是这样的:

$mech->form_name($name);
$mech->field($field_name, $field_value);
my $response = $mech->click('Button');

应该管用。我相信如果您获得该字段并直接使用它(即my $field = $mech->form_name($name);然后使用 $field 方法而不是 $mech.

于 2012-01-01T01:38:49.973 回答
0

我设法让它按照我的意愿工作。感谢 Timbus 和 knb 的建议。虽然我的情况可能并不完全一般(我知道预设值),但我会分享我发现的内容(通过跟踪和错误)。

my $mech = WWW::Mechanize->new();
$mech->get($url);  
$mech->form_name( $name );

my $fields = $mech->form_name($name);
foreach my $k ( @{$fields->{inputs}}){
 if ($k->{value} eq $default_value){
   $k->{value}=$field_value;
   }
}

my $response = $mech->click('Button_name');
于 2012-01-03T23:21:08.557 回答