我正在为一些现有的python代码编写一个函数,该函数将作为参数传递给mechanizebrowser对象。在
我在浏览器的表单中填写一些详细信息,并使用response = browser.submit()
将浏览器移动到新页面,并从中收集一些信息。在
不幸的是,我偶尔会遇到以下错误:
httperror_seek_wrapper: HTTP Error 500: Internal Server Error
在
我已经在我自己的浏览器中导航到了这个页面,果然,我偶尔会直接看到这个错误,所以我认为这是一个服务器问题,与robots.txt
,headers或类似的东西无关。在
问题是提交后,browser
对象的状态发生了变化,我无法继续使用它。我的第一个想法是先尝试做一个深度复制,如果遇到问题就使用它,但是这会导致错误TypeError: object.__new__(cStringIO.StringO) is not safe, use cStringIO.StringO.__new__()
,如{a1}所述。在
我也尝试过使用browser.back()
,但是得到了NoneType
错误。在
有人有好的解决办法吗?在
在
下面的一个很好的解决方案使用了优秀的requests
库(docshere)。requests
具有填写表单并通过post
或get
提交的功能,这很重要的是不会改变br
对象的状态。在
一个excellent website允许我们测试各种错误代码,并且在顶部有一个表单接口,我已经在上面测试过了。我在这个站点创建了一个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!
我假设你想要提交,即使它需要多次尝试。在
我所想到的解决方案肯定是没有效率的,但它应该是有效的。在
基本上,它将调用函数,直到在没有
HTTPError
s的情况下执行操作我已经有一段时间没有为python编写代码了,但是我想我有一个解决您的问题的方法。试试这个方法:
您可以找到关于
requests
库here的文档。我个人认为requests
比mechanize
更适合你的情况。。。但这确实需要您增加一些开销,因为您需要在浏览器中使用某种RESTful拦截器来分解原始POST的提交。在但最终,通过传入
br
,您将自己限制在mechanize处理br.submit()
上的浏览器状态的方式。在相关问题 更多 >
编程相关推荐