2011-02-08 80 views
2

我正在連接一個頁面,需要登錄與機械化。它在頭版上使用了一些JavaScript,使得使用機械化直線更困難。我知道我必須提交什麼表單來登錄 - 總是由js生成的表單,每次都是一樣的。我怎樣才能使機械化只是提交不在頁面上的自定義表單?基本上相當於this perl problem,但在Python中。蟒蛇機械化 - 提交自定義表格

回答

5

(注:此想出了最近一次事實上,我現在的工作)

這似乎工作:

br.open(URL) 
res = mechanize._form.ParseString(FORM_HTML, BASE_URL) 
br.form = res[1] 
#continue as if the form was on the page and selected with .select_form() 
br['username'] = 'foo' 
br['password'] = 'bar' 
br.submit() 

URL是訪問的網站的完整URL。 BASE_URL是URL是在目錄中。FORM_HTML是具有form元素的任何HTML,例如:

<form method='post' action='/login.aspx'> 
    <input type='text' name='username'> 
    <input type='text' name='password'> 
    <input type='hidden' name='important_js_thing' value='processed_with_python TM'> 
</form> 

出於某種原因,mechanize._form.ParseString回報兩種形式。第一個請求是對基本URL的GET請求,沒有輸入;第二,從FORM_HTML正確解析的形式。

+1

老兄,如果可以的話,我會給你+100。你怎麼解決這個問題的?網絡上的其他人都沒有提出這個問題,許多人被迫放棄了這個解決方案。 – 2013-05-21 20:17:33

0

解析頁面,提取你想要的元素,改造頁面,並將它們注入機械化。

對於我工作的項目,我不得不使用模擬瀏覽器,發現機械化在表單處理上非常差。它會從JavaScript塊中抽取未解釋的元素並死亡。我不得不寫一個解決方法,使用BeautifulSoup去除所有可能導致它在到達表單解析器之前死掉的位。

您可能會也可能不會遇到這個問題,但需要牢記。我最終放棄了機械化方法,並與Selenium一起前往。它的表單處理程序是非常優越的,它可以處理JS。它有問題(瀏覽器增加了一層複雜性),但我發現它更容易處理。