Python/Django“BadStatusLine”错误

18

我遇到一个奇怪的错误,但似乎找不到解决办法。

每次我运行这段代码时,并不总是会出现这个错误,而且它也不会在同一次循环迭代中发生(它发生在一个循环中)。如果我多次运行它,它似乎不会再遇到这个错误,程序可以成功执行。无论如何,我仍然想知道为什么会出现这种情况。

这是我的错误、版本、跟踪等信息:http://dpaste.com/681658/

看起来是以下代码行引起了这个问题:

page = urllib2.urlopen(url)

其中url显然是一个URL。

我的代码中确实有import urllib2

3个回答

38

BadStatusLine异常是在调用urllib2.urlopen(url)时抛出的,当远程服务器响应一个Python无法理解的状态码时会触发。

假设您无法控制url,因此无法防止这种情况发生。您所能做的就是捕获异常,并优雅地处理它。

from httplib import BadStatusLine

try:
    page = urllib2.urlopen(url)
    # do something with page
except BadStatusLine:
    print "could not fetch %s" % url

9

其他用户的解释是正确和好的,但在实践中,您可能会发现以下内容有用:
根据我的经验,当您向URL参数发送未引用的值时,例如包含空格或需要引用或进行URL编码的其他字符的值时,通常会发生这种情况。


1
实际上,如果您发送未经适当URL编码的值,则会收到400错误请求。 - andres.riancho
也许服务器设置有误(就像我自己写的那个),导致它发送回空值而不是400。这就是BadStatusLine。 - Noumenon
1
在我的情况下,发生这种情况是因为我发送的标头中有一个'\n'。 - Uri Shalit
我发现在python头文件中发送一些特殊字符会触发一些服务器返回BadStatusLine响应(特别是反斜线和括号)。 - Luke Rehmann

8

这与Django无关,而是由urllib2抛出的异常,它在获取您的url后无法解析响应。这可能是网络问题、响应格式不正确等原因引起的...一些服务器/应用程序会随机抛出此类错误。如果您无法控制此URL返回的内容,那么只能捕获异常,调试导致问题的URL并尝试识别模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接