python学习之----异常处理小示例

网络是十分复杂的。网页数据格式不友好,网站服务器宕机,目标数据的标签找不到,都

是很麻烦的事情。网络数据采集最痛苦的遭遇之一,就是爬虫运行的时候你洗洗睡了,梦

想着明天一早数据就都会采集好放在数据库里,结果第二天醒来,你看到的却是一个因某

种数据格式异常导致运行错误的爬虫,在前一天当你不再盯着屏幕去睡觉之后,没过一会

儿爬虫就不再运行了。那个时候,你可能想骂发明互联网(以及那些奇葩的网络数据格

式)的人,但是你真正应该斥责的人是你自己,为什么一开始不估计可能会出现的异常!

html = urlopen("http://www.pythonscraping.com/pages/page1.html")

这行代码主要可能会发生两种异常:

? 网页在服务器上不存在(或者获取页面的时候出现错误)

? 服务器不存在

第一种异常发生时,程序会返回HTTP 错误。HTTP 错误可能是“404 Page Not Found”“500

Internal Server Error”等。所有类似情形,urlopen 函数都会抛出“HTTPError”异常。我们

可以用下面的方式处理这种异常:

try:

html = urlopen("http://www.pythonscraping.com/pages/page1.html")

except HTTPError as e:

print(e)

# 返回空值,中断程序,或者执行另一个方案

else:

# 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),

# 那么就不需要使用else语句了,这段代码也不会执行

如果程序返回HTTP 错误代码,程序就会显示错误内容,不再执行else 语句后面的代码。

如果服务器不存在(就是说链接http://www.pythonscraping.com/ 打不开,或者是URL 链接

写错了),urlopen 会返回一个None 对象。这个对象与其他编程语言中的null 类似。我们

可以增加一个判断语句检测返回的html 是不是None:

if html is None:

print("URL is not found")

else:

# 程序继续

当然,即使网页已经从服务器成功获取,如果网页上的内容并非完全是我们期望的那样,

仍然可能会出现异常。每当你调用BeautifulSoup 对象里的一个标签时,增加一个检查条件

保证标签确实存在是很聪明的做法。如果你想要调用的标签不存在,BeautifulSoup 就会返

初见网络爬虫 | 9

回None 对象。不过,如果再调用这个None 对象下面的子标签,就会发生AttributeError

错误。

下面这行代码(nonExistentTag 是虚拟的标签,BeautifulSoup 对象里实际没有)

print(bsObj.nonExistentTag)

会返回一个None 对象。处理和检查这个对象是十分必要的。如果你不检查,直接调用这个

None 对象的子标签,麻烦就来了。如下所示。

print(bsObj.nonExistentTag.someTag)

这时就会返回一个异常:

AttributeError: ‘NoneType‘ object has no attribute ‘someTag‘

那么我们怎么才能避免这两种情形的异常呢?最简单的方式就是对两种情形进行检查:

try:

badContent = bsObj.nonExistingTag.anotherTag

except AttributeError as e:

print("Tag was not found")

else:

if badContent == None:

print ("Tag was not found")

else:

print(badContent)

初看这些检查与错误处理的代码会觉得有点儿累赘,但是,我们可以重新简单组织一下代

码,让它变得不那么难写(更重要的是,不那么难读)。例如,下面的代码是上面爬虫的

另一种写法:

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)

在这个例子中,我们创建了一个getTitle 函数,可以返回网页的标题,如果获取网页

的时候遇到问题就返回一个None 对象。在getTitle 函数里面,我们像前面那样检查了

HTTPError,然后把两行BeautifulSoup 代码封装在一个try 语句里面。这两行中的任何一

行有问题,AttributeError 都可能被抛出(如果服务器不存在,html 就是一个None 对象,

html.read() 就会抛出AttributeError)。其实,我们可以在try 语句里面放任意多行代码,

或者放一个在任意位置都可以抛出AttributeError 的函数。

时间: 2024-10-06 20:04:40

python学习之----异常处理小示例的相关文章

python学习之----BeautifulSoup小示例

BeautifulSoup 库最常用的对象恰好就是BeautifulSoup 对象. from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page1.html") bsObj = BeautifulSoup(html.read()) print(bsObj.h1) bsObj.tagname只能获取页面中的

python学习-基础-异常处理

异常: 异常(exception):因运行时错误而出现,会产生一个traceback "traceback"是出现的运行时错误的一个详细描述 常见异常:(待完善) 数据不符合期望的格式时会出现ValueError 数据无法正常访问时会出现IOErroe(例如,可能你的数据文件被移走或者重命名) NameError ,调用的变量名称不存在 处理异常: try/except语句提供了一个异常处理机制,从而保护可能导致运行时错误的某些代码 pass语句就是python的空语句或null语句,

Python 学习笔记 - 作用域小知识

Python的作用域和其他语言有所不同,他有几个小窍门来判断作用域. 1. Python里面没有块级别的作用域:只有函数级别的作用域. 比如说,下面这个例子,如果是Java或者其他语言,肯定报错name没有定义.Python里面因为不存在块级别的作用域,因此name直接就输出9了 >>> for i in range(10):     name=i print(name) ---------- 9 2. 作用域链的顺序是从内往外找,直到找不到为止 例如 >>> def 

python学习之异常处理

一.语法导致的异常,应该在程序运行前处理 例子: print( 输出: File "E:/python/oldboyday9/learn1.py", line 4     if      ^ SyntaxError: invalid syntax 注:输出分三个部分,第一部分错我位置,第二部分SyntaxError错误类型,第三部分错误值invalid syntax 二.逻辑导致的错误 使用try...except捕获异常并处理异常 例子: try:     a = 1/0 excep

python学习笔记异常处理(七)

异常处理 异常处理是工作中编写代码必须要完成的内容,对于不符合预期的操作,程序总会出现异常情况,而对异常情况能够妥善处理,是保证程序稳定性的关键. >> f = input("filename")filename/hone/a.py>> ff = open(f)Traceback (most recent call last):File "<stdin>", line 1, in <module>FileNotFoun

Python学习手册之正则表达式示例--邮箱地址提取

在上一篇文章中,我们介绍了 Python 的捕获组和特殊匹配字符串,现在我们介绍 Python 的正则表达式使用示例.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10040430.html 邮箱地址提取为了演示正则表达式的示例用法,我们创建一个从字符串中提取电子邮箱地址的程序.假设我们有一个包含电子邮箱地址的字符串. string = "Please contact [email protected] for assistance" 我们希

python学习之jquery小练习

<html> <head> <title>html/css/js学习小结</title> <script src="jquery-1.8.3.js"></script> <style type="text/css"> /*span { display:inline; width:16%; }*/ li { display:table-cell; width:0.5%; margin-

Python学习笔记(异常处理)

用户输入了一个不合规定的值,或者需要打开的文件不存在.这些情况被称作"异常",一个好的程序需要能处理可能发生的异常,避免程序因此而中断. 例如我们去打开一个文件: f = file('non-exist.txt') print 'File opened!' f.close() 假如这个文件因为某种原因并没有出现在应该出现的文件夹里,程序就会报错: IOError: [Errno 2] No such file or directory: 'non-exist.txt' 程序在出错处中断

Python学习之--异常处理

Python中的Exceptions是所有异常的基类,内置的异常类都放在了exceptions模块中,通过dir()函数可以看到这些内置的类 import exceptions ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'Ex