HTTPError和URLError
在运行以下代码时,在我原先的理解中最后应该打印”ASDASD”和”Title could not be found”。
1 | from urllib.request import urlopen |
因为为了测试捕捉HTTPError异常将正确网址”http://www.pythonscraping.com/pages/page1.html"修改成"http://www.apythonscraping.com/pages/page1.html",即添加了一个a。可是运行后并没有出现想象中的情况,而是直接打印了错误信息。
网上搜寻文档和阅读别人的博客Penguin后才意识到其实是自己对HTTPError和URLError理解不深刻。
实际上HTTPError错误会在以下情况发生:
- 网页在服务器上不存在(或者获取页面的时候出现错误)
- 服务器不存在
- 没有网络连接
当和一个服务器进行请求时,服务器会作出相应的应答,返回相应的状态码,如200,404等,HTTPError正是根据这个状态码来作出反应。我仅仅是将网站改成一个错误的网站并没有触发以上错误,也就没有相应状态码交给HTTPError进行判断,所以无法捕捉到HTTPError异常也就无法出现我想象的结果。
而HTTPError是URLError的子类,出现HTTPError错误一定会出现URLError错误,反之不一定。URLError错误正是处理类似网址错误、传输数据不完整等的错误,而这些错误不会导致HTTPError的触发。
所以修改以上代码为即可出现我想要的结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from urllib.request import urlopen
from urllib.error import HTTPError
from urllib.error import URLError
from bs4 import BeautifulSoup
def getTitle(url):
try:
html = urlopen(url)
except HTTPError as e:
print('asd')
return None
except URLError as e:
print('der')
return None
try:
bsObj = BeautifulSoup(html.read() , 'lxml')
title = bsObj.body.h1
except AttributeError as e:
return None
return title
title = getTitle("http://www.apythonscraping.com/pages/page1.html")
# title = getTitle("http://asd.com")
if title == None:
print("Title could not be found")
else:
print(title)