2016-10-01 19 views
7

Tôi muốn gửi biểu mẫu ở nhiều trang web với cơ giới hóa. Thông thường tôi không thể biết chính xác tên của biểu mẫu hoặc id biểu mẫu, nhưng tôi biết tên đầu vào mà tôi muốn gửi.chọn đúng biểu mẫu trong khi lặp lại tất cả các biểu mẫu

Giả sử có một trang web có vài biểu mẫu bên trong. Mã của tôi nên kiểm tra tất cả các biểu mẫu, nếu một trong số chúng có giá trị đầu vào có tên là "email", nó sẽ gửi biểu mẫu đó. Nếu có nhiều biểu mẫu, nó sẽ gửi tất cả.

Trang web tôi đang thử nghiệm có hai biểu mẫu. Một trong số đó là biểu mẫu đăng nhập, biểu mẫu còn lại là biểu mẫu đăng ký. Cả hai đều có giá trị đầu vào "email". Vì vậy, mã của tôi nên gửi cả hai biểu mẫu.

Tôi đang cố gắng để đạt được nó với khối mã này:

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 

Mã này in hai thông điệp thành công, tuy nhiên đó không phải đăng ký cao. Mã sau đây hoạt động với việc gửi biểu mẫu đăng ký vì tôi đặt tên biểu mẫu:

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() 

Vì vậy, mã đầu tiên có vấn đề gì? Làm cách nào tôi có thể chọn cả hai biểu mẫu và gửi giá trị? Có thể vấn đề là với phần lựa chọn hình thức đó:

br.select_form(nr=0) 

Chỉnh sửa: Tôi đã kiểm tra yêu cầu POST bằng Wireshark. Có vẻ như nó điền vào biểu mẫu đầu tiên trong 2 lần. Khi tôi thay đổi nr=0 với nr=1 nó hoạt động vì biểu mẫu chính xác là biểu mẫu thứ hai.

+0

Bạn nên làm rõ rằng bạn đang sử dụng Cơ chế cho việc này. Một vài đoạn đầu tiên của câu hỏi của bạn gây nhầm lẫn vì 99% thời gian bạn mô tả sẽ có trong ngữ cảnh của một trình duyệt web. – borfast

Trả lời

0

Vấn đề của bạn là bạn không lưu trữ biểu mẫu bạn đang làm việc. Tôi chỉ cần gán 0 vào một biến và thêm 1 vào nó sau mỗi lần lặp. Vì vậy, mã của bạn nên là:

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 

Lưu ý: x += y bằng x = x + y

Chỉnh sửa: Bạn nên sửa thụt của bạn cũng vậy, bạn không cần phải nhấn tab hai lần, một tác phẩm báo chí quá!

+0

cảm ơn bạn nhưng nó không hoạt động. vẫn gửi biểu mẫu đầu tiên cho 2 lần – JayGatsby

+0

xấu của tôi, hãy kiểm tra mã mới –

+0

vẫn kết quả tương tự – JayGatsby

0

Một giải pháp là chọn biểu mẫu bằng cách chuyển biểu mẫu danh sách vào br.form mà không cần sử dụng br.select_form.

Nội dung 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> 

và kịch bản python chỉnh sửa:

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] 

này nộp dưới hình thức 1 và 2 nhưng không 3. Hy vọng tôi đã hiểu vấn đề một cách chính xác.

Các vấn đề liên quan