2012-12-07 41 views
1

根據對SO和其他來源,我想使用Python的urllib/urllib2的以以下方式提交表單發現了一些簡單的例子:多POST提交表單元素

>>> import urllib, urllib2 
>>> url = 'http://example.com' 
>>> r_params = {'a':'test','b':'hooray'} 
>>> e_params = urllib.urlencode(r_params) 
>>> user_agent = 'some browser and such' 
>>> headers = {'User-Agent': user_agent} 
>>> req = urllib2.Request(url, e_params, headers) 
>>> response = urllib2.urlopen(req) 
>>> data = response.read() 

我已經得到了這個工作,但是,在我正在尋找的特定形式有兩個「提交」類型的按鈕。例如:

<b><input type="submit" name="ButtonA" value="SUBMIT"></b> 
<b><input type="submit" name="ButtonB" value="LINK"></b> 

我相信我從目前的代碼選擇錯誤的結果的問題。如何通過提交ButtonB而不是ButtonA來獲得回覆?我讀過的一些東西似乎表明我可以嘗試使用機械化,但我希望保持這種簡單而不必閱讀和學習機械化。有沒有簡單的方法來做到這一點,還是我需要吸取它,並且真正花時間學習和理解我在做什麼?

回答

2

它應該是相當簡單的,如果是那樣的話 - 你應該看看在準確你在做什麼。具體來說,你發送一個POST請求(urllib2.urlopen會自動發送一個POST請求,如果提供了數據參數的話)和通常由表單元素本身提供的數據。在多個「提交」輸入的情況下,激活的提交輸入的名稱和值將與表單數據的其餘部分一起發送。

所以,這就是你需要做的 - 包括「ButtonB」:「LINK」的數據。

快速參考,所以你可以看到HTML如何做它所做的一切東西: http://www.w3.org/TR/html401/interact/forms.html#submit-format

+0

我只是做了r_params = { '一': '測試', 'B': '萬歲', 'ButtonB': 'LINK'} 和它的工作很大。謝謝! –

2

我建議使用像TamperData用於Firefox的工具是如何形成的網站發表的帖子準確地發現。在準備點擊其中一個按鈕之前激活TamperData。當它結束時,繼續並單擊一個。 POST將被記錄在TamperData中。找到它並點擊它。

找到下面的POSTDATA行並雙擊它。選擇「Decoded」單選按鈕以刪除HTML轉義。現在你有一個1:1的引用,你應該在製作「r_params」字典時複製。舉例來說,如果POSTDATA是這樣的:

Name  | Value 
-------------------- 
QueryString | test 
Page  | 
Search  | blah 

,那麼你將創建你的詞典是這樣的:

r_params = {'QueryString': 'test', 
      'Page': '', 
      'Search':, 'blah'} 

你發現後出了什麼POSTDATA看起來像每個單獨提交事件,你會知道如何創建正確的字典來發送。此外,請務必確認您正在發佈到正確的網址。祝你好運!

+0

啊,謝謝你。我得到了這個工作,這讓我更加明白我現在正在做什麼。 –