python爬虫HTTPError 和 AttributeError错误及改进措施

爬虫的时候很容易发生错误,为了避免因为某几个网页错误影响所有网页的爬取,在代码中加入错误检测机制是很有必要的

HTTPError

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

运行以上代码主要会发生两种异常:

  • 网页在服务器上不存在(或者获取页面的时候出现错误)
  • 服务器不存在
    这两种错误,urlopen都会抛出HTTPError异常。可以用以下方式处理:
try:     
	html = urlopen("http://www.pythonscraping.com/pages/page1.html") 
except HTTPError as e:  
	print(e)
   # 返回空值,中断程序,或者执行另一个方案
else:
     # 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断
     # 那么就不需要使用else语句了,这段代码也不会执行

AttributeError

即使网页已经从服务器成功获取,如果网页上的内容并非完全是我们期望的那样, 仍然可能会出现异常。
每当你调用 BeautifulSoup 对象里的一个标签时,增加一个检查条件保证标签确实存在是很聪明的做法。如果你想要调用的标签不存,BeautifulSoup 就会返回 None 对象。不过,如果再调用这个 None 对象下面的子标签,就会发生 AttributeError 错误。
假设返回对象bsObj中没有h1这个标签,那么:

print(bsObj.h1)

会返回None对象。如果进一步:

print(bsObj.h1.someTag)

就会出现AttributeError异常。可以用以下方式处理:

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.h
        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)

你可能感兴趣的:(python,爬虫)