10.3.2 問(wèn)題2:非法字符拋出異常當(dāng)我們將某個(gè)字符串從GBK解碼為Unicode的時(shí)候,可以采用: str1.decode('GBK') 但是在實(shí)際進(jìn)行網(wǎng)絡(luò)爬蟲的時(shí)候,可能會(huì)遇到如下異常: UnicodeDecodeError:'GBK'codec can't decode byte in position 20146-20147:illegal multibyte sequence 出錯(cuò)的原因是有些網(wǎng)站的編碼不規(guī)范,在一個(gè)頁(yè)面里混入了多種編碼,于是出現(xiàn)了非法字符。 例如,全角的空格往往有多種不同的實(shí)現(xiàn)方式,如\xa3\xa0、\xa4\x57,這些字符看起來(lái)像是全角空格,但是它們并不是真正的全角空格,真正的全角空格為\xa1\xa1,所以在解碼的過(guò)程中就會(huì)出現(xiàn)異常。但是這樣的問(wèn)題很讓人頭疼,因?yàn)橹灰址谐霈F(xiàn)了一個(gè)非法字符,整個(gè)爬蟲程序都有可能因此報(bào)錯(cuò),進(jìn)而停止運(yùn)行。 解決方法很簡(jiǎn)單,可以采用ignore忽略這些非法字符: str1.decode('GBK','ignore') 在decode方法中,decode的函數(shù)原型為decode([encoding],[errors='strict']),第二個(gè)變量為控制錯(cuò)誤處理的方式,默認(rèn)為strict,遇到非法字符時(shí)會(huì)拋出異常。 我們可以把第二個(gè)參數(shù)設(shè)置為其他變量,有以下3種方法: (1)ignore,忽略其中的非法字符,僅顯示有效字符。 (2)replace,使用符號(hào)代替非法字符,如'?'或'\ufffd'。 (3)xmlcharrefreplace,使用XML字符引用代替非法字符。 |
|