我想写一个让我使用这个网站的脚本
http://proteinmodel.org/AS2TS/LGA/lga.html
(我需要使用它几百次,我不想手动这样做)
我已经在互联网上搜索了如何使用Perl完成此操作,我遇到WWW::Mechanize
,这似乎正是我想要的。但是现在我发现我想要使用的网站上的表单没有名称 - 它的声明行只是读取
<FORM METHOD="POST" ACTION="./lga-form.cgi" ENCTYPE=multipart/form-data>
首先,我尝试不设置我的WWW::Mechanize
对象的form_name
属性,当我为表单的电子邮件地址字段提供值时,它给了我这个错误消息:
Argument "my_email@address.com" isn't numeric in numeric gt (>) at /usr/share/perl5/WWW/Mechanize.pm line 1618.
然后我尝试将form_name
设置为''
,然后设置' '
,但这无济于事,我只是得到了这样的信息:
There is no form named " " at ./automate_LGA.pl line 40
有什么方法可以处理没有名字的表格?如果有人在这里回答这个问题,那将是最有帮助的 - 即使答案指向不使用WWW::Mechanize
,因为我只是想完成工作,(或多或少)无论如何。
提前多多感谢!
答案 0 :(得分:6)
一种简单且更健壮的方法是使用$mech->form_with_fields()中的WWW::Mechanize方法根据其中包含的字段选择所需的表单。
更简单的是,使用submit_form
方法和with_fields
选项。
例如,要找到一个包含名为“username”和“password”字段的表单,请填写并提交表单,这很简单:
$mech->submit_form(
with_fields => { username => $username, password => $password }
);
这样做的好处是,如果他们随意改变HTML,改变HTML中表单的顺序,或者在您感兴趣的表单之前添加新表单,您的代码将继续有效。 / p>
答案 1 :(得分:1)
我不知道WWW::Mechanize
,但它的Python等价物mechanize为您提供了一系列表格,即使您不知道它们的名字也可以迭代。
示例(摘自其主页):
import mechanize
br = mechanize.Browser()
br.open("http://www.example.com/")
for form in br.forms():
print form
编辑:在WWW::Mechanize
的文档中搜索我找到了$mech->forms() method,这可能就是您所需要的。但由于我不知道perl或WWW::Mechanize
,我会留下我的python答案。
答案 2 :(得分:0)
好的,我找到了答案。我可以通过它的号码来解决这个无名表格(网页上只有一个表格,所以我猜它会是数字1
,而且它有效)。这是我的代码的一部分:
my $lga = WWW::Mechanize->new();
my $address = 'my_email@address.com';
my $options = '-3 -o0 -d:4.0';
my $pdb_2 = "${pdb_id}_1 ${pdb_id}_2";
$lga->get('http://proteinmodel.org/AS2TS/LGA/lga.html');
$lga->success or die "LGA GET fail\n";
$lga->form_number(1);
$lga->field('Address', $address);
$lga->field('Options', $options);
$lga->field('PDB_2', $pdb_2);
$lga->submit();
$lga->success or die "LGA POST fail\n";