2016-10-01 2 views
7

Я хочу отправить формы на нескольких сайтах с механизированным. Обычно я не могу точно знать имя формы или идентификатор формы, но я знаю имя ввода, которое я хочу отправить.выбор правильной формы при повторении всех форм

Предположим, что в нем есть несколько форм. Мой код должен проверять все формы, если один из них имеет входное значение с именем «электронная почта», он отправит эту форму. Если у него есть несколько форм, он будет отправлять их все.

Веб-сайт, который я тестирую, имеет две формы. Одна из них - это форма входа в систему, другая - форма подписки. У обоих из них есть входное значение электронной почты. Поэтому мой код должен представить обе формы.

Я пытаюсь добиться его с помощью этого блока кода:

for forms in br.forms(): 
       if not forms.find_control(name="email"): 
        continue 
       br.select_form(nr=0)   
       br.form["email"] = email 
       br.submit() 
       print "Success: ", link 

Этот код печатает два успешных сообщения, однако это не выписывает. Следующий код работает с отправкой формы подписки, потому что я установил имя формы:

br = mechanize.Browser() 
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6')] 
br.open("http://example.com") 
br.select_form("subscribe") 
br.form["email"] = email 
br.submit() 

Итак, что не так с первым кодом? Как я могу выбрать обе формы и представить значение? Вероятно, проблема связана с этой частью выбора формы:

br.select_form(nr=0) 

Редактировать: Я проверил его POST-запросы с Wireshark. Кажется, что он заполняет первую форму 2 раза. Когда я меняю nr=0 с nr=1, это работает, потому что правильная форма является второй формой.

+0

Вы должны уточнить, что для этого вы используете Mechanize. Первые несколько абзацев вашего вопроса путают, потому что 99% времени, которое вы описываете там, будет в контексте веб-браузера. – borfast

ответ

0

Ваша проблема в том, что вы не храните какую форму вы работаете. Я просто назначил бы 0 в переменную и добавлял бы 1 к ней после каждой итерации. Так что ваш код должен быть:

currentForm = 0 
for form in br.forms(): 
     if not forms.find_control(name = "email"): 
       currentForm += 1 
       continue 
     print "Selecting form number %i..." % currentForm 
     br.select_form(nr = currentForm) 
     br.form["email"] = email 
     br.submit() 
     currentForm += 1 
     print "Success: ", link 

Примечание: x += y равно x = x + y

Edit: Вы должны исправить свои отступов тоже вам не нужно нажать вкладку дважды, один пресс тоже работает!

+0

спасибо, но он не работает. все еще подает первую форму за 2 раза – JayGatsby

+0

мой плохой, проверьте новый код –

+0

все тот же результат – JayGatsby

0

Одним из решений является выбор формы путем передачи формы списка в br.form без использования br.select_form.

Содержание test.html:

<html> 
<head> 
    <title>Stuff</title> 
</head> 
    <body> 

     <form method="POST" > 
      <input type="text" name="email"> 
     </form> 
     <form method="POST"> 
      <input type="text" name="email"> 
     </form> 
     <form method="POST"> 
      <input type="text" name="notemail"> 
     </form> 

    </body> 
</html> 

и модифицированный скрипт Python:

import mechanize 
import sys 

br = mechanize.Browser() 
br.open("http://localhost/test.html") 

email = "[email protected]" 
for form in br.forms(): 

    br.form = form 

    try: 
     textctrl = br.form.find_control(name="email") 
     textctrl.value = email 
     response = br.submit() 

     print "Found email input, Submitted", response 

    except mechanize.ControlNotFoundError: 
     print "No Email control" 

    except: 
     print "Unexpected error:", sys.exc_info()[0] 

Это подаёт форма 1 и 2, но не 3. Надеюсь, что я правильно понял проблему.

Смежные вопросы