爬虫的时候很容易发生错误,为了避免因为某几个网页错误影响所有网页的爬取,在代码中加入错误检测机制是很有必要的
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
运行以上代码主要会发生两种异常:
try:
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
print(e)
# 返回空值,中断程序,或者执行另一个方案
else:
# 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断
# 那么就不需要使用else语句了,这段代码也不会执行
即使网页已经从服务器成功获取,如果网页上的内容并非完全是我们期望的那样, 仍然可能会出现异常。
每当你调用 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)