我正在尝试使用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中解决这个问题吗?
答案 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服务器可以随意返回任何状态代码,但问题可能完全不同。