1. 程式人生 > >1.2 常見異常的處理方法

1.2 常見異常的處理方法

簡單 1.2 req 獲取網頁 quest 處理方法 鏈接 註意 方法

在import後面的第一行代碼:

html = urlopen("http://www.baidu.com")

常見的異常主要有以下兩種:

  • 網頁在服務器上不存在(或者獲取頁面的時候出現錯誤)
  • 服務器不存在

第一種錯誤時,程序會返回HTTP錯誤。HTTP錯誤可能是“404 Page Not Found”,“500 Internal Server Error”等等。所有類似的情形,對於urlopen函數來說,都會拋出“HTTPError”異常。我們可以用以下方式處理這種異常:

try:
    html = urlopen("
http://www.baidu.com") except HTTPError as e: print(e) #如果返回空值,中斷程序,或者執行另一個方案 else: #程序繼續。註意:如果你已經在上面異常捕捉那一段代碼裏返回或者中斷(break), # 那麽就不需要使用else語句了,這段代碼就不會再執行了。

如果程序服務器不存在(鏈接寫錯了,或者鏈接打不開),urlopen會返回一個None對象。這個對象與其他編程語言中的null相似。我們可以用一個判斷語句來檢測返回的html是不是None:

if html is None:
    print("URL is not found.")
else:
    # 程序繼續

在服務器成功獲取網頁後,如果網頁上的內容不是我們預期的那樣的,仍然可能會出現異常。因此,每次在調用BeautifulSoup時,最好加一個檢查條件,以保證標簽確實存在。假如調用的標簽不存在,BS就會返回一個None對象。不過,如果再調用這個None下的子標簽時就會返回AttributeERROR錯誤。

    print ("bs0bj.nonExistentTag")

會返回一個None對象。處理和檢查這個對象十分必要。如果直接調用這個對象的子標簽,就會出現異常:

    print("bs0jb.nonExistentTag.someTag")
    # 下面會返回一個異常
    AttributeError: ‘NoneType‘ object has no attribute ‘someTag‘

下面的代碼是同時檢測兩種異常的簡單代碼方法:

try:
    badContent = bs0bj.nonExistingTag.anotherTag
except AttributeError as e:
    print("Tag is 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 getTittle(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        return None
    try:
        bs0bj = BeautifulSoup(html.read())
        title = bs0bj.body.h1
    except AttributeError as e:
        return None
    return title
title = getTittle("http://www.pythonscraping.com/pages/page1.html")
if title ==None:
    print("Title could not be found.")
else:
    print(title)

  

1.2 常見異常的處理方法