BeautifulSoup学习笔记(一)常见异常

Python爬虫常见异常

网络页面不存在

1
2
3
4
5
6
7
try:
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
print(e)
# 返回空值,中断程序,或者执行另一个方案 else:
# 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),
# 那么就不需要使用else语句了,这段代码也不会执行

这发生在获取网页的时候。如果程序返回 HTTP 错误代码,程序就会显示错误内容,不再执行 else 语句后面的代码。

服务器不存在

1
2
3
4
if html is None:
print("URL is not found")
else:
# 程序继续

如果服务器不存在(就是说链接 http://www.pythonscraping.com/ 打不开,或者是 URL 链接 写错了),urlopen 会返回一个 None 对象。

标签不存在异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTitle(url):
try:
html = urlopen(url)
except HTTPError as e:
return None
try:
bsObj = BeautifulSoup(html.read())
title = bsObj.body.h1
except AttributeError as e:
return None
return title
title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
print("Title could not be found")
else:
print(title)

调用的标签不存在的时候会返回 None 对象,这个时候是没有问题的,但是如果继续调用这个 None 对象的下一级标签就会出现问题了,返回 AttributeError 错误,这里把获取Title中可能碰到的所有情况封装成了一个函数集中处理异常的发生,包括:网页不存在异常、标签两种异常,是最规范的写法。其中网页是 None 以及标签是 None 都会导致 AttributeError 。