2011-12-20 90 views
7

嗯,我正嘗試使用Python和機械化登錄到一個站點。使用機械化提交表單(Python)

我已經得到了網站開通:

site = br.open("http://example.com/login.php") 

而且我已經得到的表單列表(與br.forms)。

<GET http://example.com/search.php application/x-www-form-urlencoded 
<HiddenControl(search=1) (readonly)> 
... 
<POST http://example.com/login.php application/x-www-form-urlencoded 
<TextControl(username=)> 
<PasswordControl(password=)> 
<CheckboxControl(stay=[1])> 
<SubmitControl(<None>=Log in) (readonly)>> 

我一直在試圖提交用戶名和密碼字段。

我試圖做這樣的:

br.select_form(nr=0) 
br.form["username"] = 'usernamehere' 
br.form["password"] = 'passwordhere' 
br.submit() 

然後我意識到,我試圖填寫表格不是第一個在頁面上,但改變0不與任何幫助。我應該如何選擇這樣的頁面上的表單?

但是!這不是唯一的問題。

當我運行它,我得到這個錯誤:

Traceback (most recent call last): 
File "C:\Python26\login.py", line 34, in <module> 
br.form["username"] = 'usernamehere' 
... 
ControlNotFoundError: no control matching name 'username' 

我該如何解決這個問題? D:還是我做錯了?如果是後者,我該如何去做呢?

回答

4

使用它的名稱來選擇一個表格,您應該使用:

br.select_form(name="order") 

你在這裏做:

br.form["username"] = 'usernamehere' 

正試圖在選定的表單中爲控件設置一個值,因此當他找不到它時,它會拋出您看到的異常。

+0

br.select_form(name =「username」)拋出一個錯誤:FormNotFoundError:沒有匹配名稱'username'的表單 - 與以前一樣,但是這次是我剛剛添加的行。 – Matthew 2011-12-20 05:25:54

+0

你確定你有正確的名字嗎?試試br.forms()中的表單:print form – tovmeod 2011-12-22 01:27:40

+0

Positive。我檢查了br.forms()和原始html。 – Matthew 2011-12-27 08:12:03

0

如果通過JavaScript生成的表單你可能有幾個問題

  • ,你不能用機械化解決這個問題 - 至少不以直接的方式 - 在這種情況下,我建議你試試並使用selenium - 您可以嘗試查看頁面HTML源代碼 - 如果您在純HTML中沒有表單,則很明顯它是通過javascript插入到DOM中的。另外,如果形式通過JavaScript提交,機械化不會幫你

  • 也,形式可能不會在第一頁上 - 你可能需要設置機械化跟隨重定向

+0

不,它不是JavaScript。我可以使用urllib訪問表單...我只是想使用機械化,因爲我不確定cookiejar是如何工作的,我需要保持登錄> _>並且login.php是表單位置。我確信這一點。 – Matthew 2011-12-20 04:55:58