我正在尝试使用WWW::Mechanize
perl模块通过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
中{p> $mech->submit_form
无论什么原因都不会替换该值,而是在原始值之后将$field_value
添加到表单中:
{submitted_field_value} = {original_value},{provided_value}
如何在要提交的表单中将{original_value}
替换为{provided_value}
?
答案 0 :(得分:1)
如果在调用$ mech-> submit_form()之前将此单行添加到代码中会发生什么:
$mech->field( $name, [$field_value], 1 );
这可确保添加第一个值,如果已存在则覆盖第一个值。 1 是数字参数(或位置索引)
请参阅WWW :: Mechanize:
的文档$ mech->字段($ name,\ @values,$ number)
给定字段的名称,将其值设置为指定的值。 [...]
可选的$ number参数用于区分两者 具有相同名称的字段。字段编号为1。
答案 1 :(得分:0)
重要的是要记住WWW :: Mechanize更好地被认为是一个“无头浏览器”而不是说LWP或curl,它只能为你处理所有烦人的http请求。当你做事时,机甲保持其状态。
您需要使用$mech->forms
或类似内容(its best to decide from the documentation. I mean there so many ways to do it.)来获取表单,然后使用field methods设置要更改的输入字段。
我想这样做的基本方法就是这样:
$mech->form_name($name);
$mech->field($field_name, $field_value);
my $response = $mech->click('Button');
应该有效。我相信如果你得到该字段并直接使用它(即my $field = $mech->form_name($name);
然后使用$ field方法而不是$ mech,它也会起作用。
答案 2 :(得分: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');