如何在网站上处理无名表格?

时间:2011-03-21 09:47:40

标签: perl forms web automation

我想写一个让我使用这个网站的脚本

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,因为我只是想完成工作,(或多或少)无论如何。

提前多多感谢!

3 个答案:

答案 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";