Sta*_*ckG 12 python mechanize http-error
我正在为一些现有的python代码编写一个函数,该代码将作为参数传递给Mechanize浏览器对象.
我在浏览器中填写表格中的一些细节,并用于response = browser.submit()将浏览器移动到新页面,并从中收集一些信息.
不幸的是,我偶尔会收到以下错误:
httperror_seek_wrapper: HTTP Error 500: Internal Server Error
我已经在我自己的浏览器中导航到该页面,果然,我偶尔会直接看到这个错误,所以我认为这是一个服务器问题,与robots.txt标题或类似内容无关.
问题是提交后,browser对象的状态发生了变化,我无法继续使用它.我首先想到的是先尝试采取深拷贝和使用,如果我遇到了问题,但提供了错误TypeError: object.__new__(cStringIO.StringO) is not safe, use cStringIO.StringO.__new__()的描述在这里.
我也试过使用browser.back()但得到NoneType错误.
有没有人有这个好的解决方案?
下面一个很好的解决方案使用优秀的requests库(这里的文档).requests具有填写表单并通过post或提交的功能get,其中重要的是不会改变br对象的状态.
一个优秀的网站允许我们测试各种错误代码,并在顶部有一个表单界面,我已经测试过它.我br在这个站点创建一个对象,然后定义一个从中选择表单的函数br,提取相关信息,但是通过提交requests- 这样br对象没有改变并且可以重复使用.错误代码导致requests返回垃圾,但不会使br不可用.
如下所述,这需要更多的设置时间,但非常值得.
import mechanize
import requests
def testErrorCodes(br,theCodes):
for x in theCodes:
br.select_form(nr=0)
theAction = br.action
payload = {'code': x}
response = requests.post(theAction, data=payload)
print response.status_code
br=mechanize.Browser()
br.set_handle_robots(False)
response = br.open("http://savanttools.com/test-http-status-codes")
testErrorCodes(br,[401,402,403,404,500,503,504]) # Prints the error codes
testErrorCodes(br,[404]) # The browser is still alive and well to be used again!
Run Code Online (Sandbox Code Playgroud)
自从我为 python 编写文章以来已经有一段时间了,但我想我有一个解决你的问题的方法。试试这个方法:
import requests
except Mechanize.HTTPError:
while true: ## DANGER ##
## You will need to format and/or decode the POST for your form
response = requests.post('http://yourwebsite.com/formlink', data=None, json=None)
## If the server will accept JSON formatting, this becomes trivial
if response.status_code == accepted_code: break
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到有关该requests库的文档。我个人认为这比...更适合您的情况,但它确实需要您多一点开销,因为您需要在浏览器中使用某种 RESTful 拦截器来分解对原始 POST 的提交。requestsmechanize
但最终,通过传入,br您将自己限制在 mechanize 处理br.submit().