在Python 3中提交表单

时间:2013-02-22 11:17:40

标签: python mechanize urllib

我正在尝试使用Python 3提交表单。在Python 2中,我执行了以下操作:

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 个答案:

答案 0 :(得分:0)

HTTP错误405是Method Not Allowed,因此您可能不允许POST到该URL。

当您传递数据时,urllib.request.Request会自动将其HTTP方法更改为POST,但也可以通过将表单参数添加到URL来通过GET提交表单,这可能是网站所期望的。查看<form>标记是否在HTML中将其method属性设置为“获取”(或者如果它完全丢失,在这种情况下默认为“获取”)。

您可以手动将表单参数添加到URL:

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

(那很hacky,但used as an example in the documentation,所以我猜这是首选方式。)

由于您没有将数据传递给构造函数,因此它将使用的方法是GET。

这可能有效。但是,由于Web服务器可以随意返回任何状态代码,但问题可能完全不同。