Как бороться с безымянными формами на сайтах? - PullRequest
0 голосов
/ 21 марта 2011

Я хотел бы написать скрипт, который позволит мне использовать этот сайт

http://proteinmodel.org/AS2TS/LGA/lga.html

(мне нужно использовать его несколько сотен раз, и я не хочу делатьэто вручную)

Я искал в интернете способы, как это можно сделать с помощью Perl, и я наткнулся на WWW::Mechanize, который, казалось, был именно тем, что я искал.Но теперь я обнаружил, что форма на этом веб-сайте, которую я хочу использовать, не имеет имени - ее строка объявления просто читает

<FORM METHOD="POST" ACTION="./lga-form.cgi" ENCTYPE=multipart/form-data>

Сначала я попытался просто не устанавливать свойство form_name моего объекта WWW::Mechanize, который дал мне это сообщение об ошибке, когда я предоставил значение для поля адреса электронной почты формы:

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 ]

6 голосов
/ 21 марта 2011

Простой и более надежный способ - использовать метод $ mech-> form_with_fields () из WWW :: Mechanize , чтобы выбрать нужную форму на основе полей, которые она содержит.

Еще проще: используйте метод submit_form с параметром with_fields.

Например, чтобы найти форму с полями с именами «username» и «password», заполните их.и отправить форму, это так же просто, как:

$mech->submit_form( 
    with_fields => { username => $username, password => $password }
);

Делать это таким образом имеет то преимущество, что если они перемешивают свой HTML, изменяют порядок форм в HTML или добавляют новую форму передтот, который вас интересует, ваш код продолжит работать.

1 голос
/ 21 марта 2011

Я не знаю о 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 () метод , это может быть то, что вам нужно. Но так как я не знаю Perl или WWW::Mechanize, я оставлю там свой ответ на Python.

0 голосов
/ 21 марта 2011

Хорошо, я нашел ответ.Я могу обратиться к безымянной форме по ее номеру (на веб-странице есть только одна форма, поэтому я предположил, что это будет число 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...