我现在正在阅读瑞安·米切尔的Python网页抓取。在第一章中,当他谈到处理错误时,他说:
If the server is not found at all (if say, site was down, or the URL was mistyped),
urlopen
returns aNone
object.
为了测试这一点,我创建了以下代码片段。在
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup as bs
def getTitle(url):
try:
html = urlopen(url).read()
except HTTPError:
return None
try:
bsObj = bs(html)
except AttributeError:
return None
return bsObj
title = getTitle('http://www.wunderlst.com')
print(title)
在这段代码的最后第二行,我故意输入了错误的URL名称(实际URL是http://www.wunderlist.com
)。我希望现在我能在屏幕上打印None
。然而,我得到了一长串错误。下面我给出了错误消息的最后一部分:
现在,如果我更正了URL名称,但是在网站前面写一些不存在的页面,例如:
title = getTitle('http://www.wunderlist.com/something')
然后在屏幕上打印None
。我真的很困惑。谁能给我解释一下到底发生了什么事?提前谢谢。在
通常会引发URLError,因为没有网络连接(没有到指定服务器的路由),或者指定的服务器不存在。在
'http://www.wunderlst.com'不存在,这就是错误引发的原因。在
查看以下链接以获取更多详细信息。在
https://docs.python.org/3.1/howto/urllib2.html#handling-exceptions
我认为问题是您只捕获了
HTTPError
(并且没有返回任何内容)。尝试同时处理/捕捉URLError
异常。在替换
from urllib.error import HTTPError
使用
from urllib.error import HTTPError, URLError
。在替换
except HTTPError:
使用
except (HTTPError, URLError):
这将提供您想要的行为(在两种情况下都返回
None
)。 但我建议分开处理这些错误(将第一个try
块移到另一个方法,停止对错误的抓取,等等)。在你所指的书/文章不是错的就是过时了。在urllib documentation中,您可以阅读
如果无法解析主机名,显然无法建立连接,因此必须根据文档引发}函数,我粗略地看一下就知道了。在
IOError
。URLError
是IOError
的一个子类,在旧的python中,urllib的新版本似乎没有{正如评论中提到的,我把库弄错了(urllib而不是urllib.请求);你会发现一句类似的话
不过在里面。大概像404这样的HTTP错误不会被认为是urlopen的错误,这就是为什么如果路径错误,它不会引发异常,但是如果无法解析主机名,它会抛出一个错误。在
相关问题 更多 >
编程相关推荐