2013-02-22 83 views
0

我試圖提交使用Python 3形式在Python 2我做了以下內容:提交表單在Python 3

br=mechanize.Browser() 
br.set_handler_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
br.open(url) 
br.select_form(nr=0) 
br.form['form_name']=entry 
br.submit() 

它的工作原理。在Python 3中,我嘗試使用下面的代碼:

data={'form_name':entry} 
data=urllib.parse.urlencode(data) 
data=data.encode('utf-8') 
headers={'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1'} 
req=urllib.request.Request(url,data,headers) 
response=urllib.request.urlopen(req) 

但它顯示HTTP錯誤405.任何人都可以請解釋如何在Python 3中工作嗎?

+1

也許你應該看看[請求](https://pypi.python.org/pypi/requests)?它與Python 3兼容並且更加pythonic。 – floqqi 2013-02-22 11:24:12

回答

0

HTTP錯誤405是Method Not Allowed,因此您可能不允許POST到該URL。

當您傳遞數據時,urllib.request.Request會自動將其HTTP方法更改爲POST,但也可以通過將表單參數添加到URL來提交表單,這可能是網站期望的。查看<form>標記是否將其method屬性設置爲HTML中的「get」(或者完全丟失,在這種情況下,它默認爲「get」)。

您可以手動添加表單參數的URL是這樣的:

data = urllib.parse.urlencode(data) 
req = urllib.request.Request("%s?%s" % (url, data), headers=headers) 

(這是哈克,但used as an example in the documentation,所以我想這是首選的方式。)

既然你不及格數據到構造函數,它將使用的方法將是GET。

這可能工作。由於Web服務器可以自由地返回他們所需的任何狀態碼,但是,這個問題可能完全是另一回事。

+1

我認爲,問題是別的。我檢查了方法。它的POST。所以當我使用requests.post使用它的模塊請求來處理它。 – Chandan 2013-02-24 11:24:44