2016-10-01 3 views
7

기계화 된 여러 웹 사이트에서 양식을 제출하고 싶습니다. 일반적으로 양식 이름이나 양식 ID를 정확히 알 수는 없지만 제출하려는 입력 이름을 알고 있습니다.모든 양식을 반복하면서 올바른 양식을 선택하십시오.

내부에 몇 개의 양식이있는 웹 사이트가 있다고 가정 해 보겠습니다. 내 코드는 모든 양식을 검사해야하며, 그 중 하나에 "email"이라는 입력 값이 있으면 양식을 제출합니다. 여러 양식에있는 경우 양식을 모두 제출합니다.

내가 테스트하는 웹 사이트에는 두 가지 형식이 있습니다. 그 중 하나는 로그인 양식이고, 다른 하나는 가입 양식입니다. 둘 다 "전자 메일"입력 값을가집니다. 그래서 내 코드는 두 가지 형식을 모두 제출해야합니다.

는이 코드 블록과 그것을 달성하기 위해 노력하고있어 :

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) 

편집 : Wireshark로 POST 요청을 확인했습니다. 첫 번째 양식이 2 번 채워진 것 같습니다. nr=0nr=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에 : 당신은 당신이 너무 들여 쓰기 수정해야합니다, 당신은 두 번 탭을 누를 필요가 없습니다, 하나 개를 눌러도 작동합니다!

+0

감사하지만 작동하지 않습니다. 여전히 2 번에 대한 첫 번째 양식을 제출 – JayGatsby

+0

내 나쁜 –

+0

여전히 동일한 결과 – JayGatsby

0

한 가지 해결책은 br.select_form을 사용하지 않고 목록 양식을 br.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> 

및 수정 된 파이썬 스크립트를

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. 희망은 내가 문제를 정확하게 이해했다.

관련 문제