2016-08-01 136 views
2

对不起,初学者问题。我刚刚学习如何访问Python中的Web数据,并且我无法理解requests包中的异常处理。使用请求处理错误的URL

到目前为止,使用urllib包访问网络数据时,I /包裹urlopen呼叫尝试不同的结构捕捉不良网址,如:

import urllib, sys 

url = 'https://httpbinTYPO.org/' # Note the typo in my URL 

try: uh=urllib.urlopen(url) 
except: 
    print 'Failed to open url.' 
    sys.exit() 

text = uh.read() 
print text 

这显然是一种原始方法要做到这一点,因为它可以掩盖除了不良网址以外的各种问题。

从文档,我已经有点聚集,你可以避开的try /除了结构使用时requests包,就像这样:

import requests, sys 

url = 'https://httpbinTYPO.org/' # Note the typo in my URL 

r = requests.get(url) 
if r.raise_for_status() is not None: 
    print 'Failed to open url.' 
    sys.exit() 

text = r.text 
print text 

然而,这显然不工作(抛出一个错误和追溯)。什么是“正确”(即简单,优雅,Pythonic)的方式来做到这一点?

回答

1

试图捕获连接错误:

from requests.exceptions import ConnectionError 

try: 
    requests.get('https://httpbinTYPO.org/') 
except ConnectionError: 
    print 'Failed to open url.' 
+0

工作。所以,为了显示我的无知,在下面的示例中(从文档中),为什么'requests.get()'命令不会停止执行:'bad_r = requests.get('http://httpbin.org/状态/ 404' )'。为什么我们使用'raise_for_status()'来查看错误? – tcquinn

+0

有“错误”的不同类型。如果你使用错误的'URL'('URL'不存在网络应用程序或不正确的'URL'构造),你会得到'ConnectionError','MissingSchema' ...这个错误意味着你的请求不能被发送。 “HTTP错误”是完全不同类型的错误。如果您的请求正确构建并且可以发送,但目标服务器无法以您期望的方式处理它,则可以获得“HTTP错误”(例如状态码401,404,500 ...)。 'python-request'在这种情况下不会引发异常,因此您可以使用'raise_for_status()'来执行它。 – Andersson

+0

明白了。我明白现在的区别。谢谢。 – tcquinn

1

您可以在关键字之后指定一种例外,但除外。因此,要赶上只是来自接触不良的错误,你可以这样做:

import urllib, sys 

url = 'https://httpbinTYPO.org/' # Note the typo in my URL 

try: uh=urllib.urlopen(url) 
except IOError: 
    print 'Failed to open url.' 
    sys.exit() 

text = uh.read() 
print text 
+0

谢谢你,比尔。我还有其他的理由想学习如何使用'requests'包,但这有助于增强我对异常处理的理解。 – tcquinn

+0

对不起,我对这个软件包并不熟悉,所以我无法提供帮助。但我希望别人能帮助你! – Bill