2016-10-01 99 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請求。它似乎填補了兩次的第一種形式。當我更改nr=0nr=1它的作品,因爲正確的形式是第二種形式。

+0

你應該說明你正在使用機械化。你的問題的前幾個段落是令人困惑的,因爲你所描述的內容中有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

編輯:您應該解決您的縮進也一樣,你不需要按下Tab鍵兩次,一個按工作呢!

+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.我理解正確的問題。