我正在尝试使用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中实现它吗?
HTTP错误405是"不允许方法",因此您可能不允许POST到该URL。
当您传递数据时,urllib.request.Request
会自动将其HTTP方法更改为POST,但也可以通过向URL添加表单参数来通过GET提交表单,这可能是网站所期望的。查看<form>
标记的method
属性在HTML中是否设置为"get"(或者是否完全缺失,在这种情况下,它默认为"get")。
您可以手动将表单参数添加到URL中,如下所示:
data = urllib.parse.urlencode(data)
req = urllib.request.Request("%s?%s" % (url, data), headers=headers)
(这很有技巧,但在文档中用作示例,所以我想这是首选方式。)
由于您没有将数据传递给构造函数,它将使用的方法将是GET。
这可能奏效。然而,由于网络服务器可以自由返回他们想要的任何状态代码,问题可能完全是其他原因。