【发布时间】:2015-08-28 07:20:12
【问题描述】:
我正在为一些现有的 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__(),如 here 所述。
我也尝试过使用browser.back(),但得到NoneType 错误。
有人有好的解决办法吗?
解决方案(感谢下面的 karnesJ.R):
下面的一个很好的解决方案使用了优秀的requests 库(文档here)。 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!
【问题讨论】:
-
你能用你目前使用的代码更新我们吗?
-
你可以尝试使用 selenuim。
-
您能否显示您的代码或提供您尝试访问的站点 URL?
-
上面添加了一些卡通代码
标签: python mechanize http-error