日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python3爬虫之中文乱码问题分析与解决方法

發布時間:2023/12/31 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python3爬虫之中文乱码问题分析与解决方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

分析

解決方法


前言:

今天簡單爬取一個網頁的源代碼時,發現出現了亂碼
python代碼:

import requestsreq = requests.get("http://www.ccit.js.cn") req_text = req.text print(req_text)

部分截圖:


分析:出現這樣的情況是什么原因呢?

(1)我們先來測試一下python3的默認編碼是什么

import sysprint('目前系統的編碼為:',sys.getdefaultencoding()) name1="驚鴻一面" name2=name1.encode("utf-8")#str通過(encode)轉為bytes print("name1的類型:",type(name1)) print("name2的類型",type(name2)) print(name2)

運行結果:

(2)知識點:

  • python3默認編碼為utf-8(unicode的一個子集,也是屬于unicode,這也就是為什么有人說python3的默認編碼是unicode,實際上是和utf-8是一樣的)
  • 字符串用str表示,編碼后的字符串用二進制bytes表示
  • 字符串通過編碼轉換為字節碼,字節碼通過解碼轉換為字符串
    str通過(encode)轉為bytes,bytes通過(decode)轉為str

(3)原因總結:
Python3的默認編碼是utf-8,所有的數據他都會以utf-8進行編碼(encode)。因此,Python3將目標網站的源碼爬取之后進行utf-8編碼,但我們所爬取的目標網站是GB2312編碼,與Python3的默認編碼不同,因而造成亂碼
解決方案:
使用通用的編碼格式

(4)注:

  • str類型的對象都是unicode,因此對于str類型的對象只有encode()方法,沒有decode()方法(如果運行,會報錯)
    原因是:只有bytes(二進制)的值才能decode,你字符串是嗎??!!
  • 避免出現亂碼的準則:
    遵循編碼使用哪種格式,解碼就使用哪種格式。
  • 出現類似UnicodeEncodeError: 'gb2312' codec can't encode character '\xb3' in position 293: illegal multibyte sequence的原因是,你需要解碼的文件中有些中文字符無法進行解碼(有些中文字符是不在GB2312范圍內的)
    此時,我們可以使用它GBK或者它的父集GB18030

(5)我們以幾種常見的編碼格式進行encode測試

import requests req= requests.get("http://www.ccit.js.cn") req_text1=req.text.encode("utf-8") req_text2=req.text.encode("GB2312") req_text3=req.text.encode("GB18030") print(req_text1)#成功編碼成bytes print(req_text2)#UnicodeEncodeError: 'gb2312' codec can't encode character '\xb3' in position 293: illegal multibyte sequence print(req_text3)#成功編碼成bytes

(6)接著上面又做了decode測試,遵行編碼使用準則,但是還是亂碼!!

import requestsreq= requests.get("http://www.ccit.js.cn")req_text1=req.text.encode("utf-8").decode("utf-8") req_text2=req.text.encode("utf-8").decode("GB2312") req_text3=req.text.encode("utf-8").decode("GB18030")req_text4=req.text.encode("GB18030").decode("utf-8") req_text5=req.text.encode("GB18030").decode("GB2312") req_text6=req.text.encode("GB18030").decode("GB18030")print(req_text1)#成功但是亂碼 print(req_text2)#UnicodeDecodeError: 'gb2312' codec can't decode byte 0xc3 in position 297: illegal multibyte sequence print(req_text3)#成功但是亂碼 print(req_text4)#UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 293: invalid start byte print(req_text5)#UnicodeDecodeError: 'gb2312' codec can't decode byte 0x81 in position 293: illegal multibyte sequence print(req_text6)#成功但是亂碼

解決方法:

那到底怎樣才能解決呢???請看如下代碼:

import requests req= requests.get("http://www.ccit.js.cn") req_text=req.text.encode("latin1").decode("GBK") print(req_text)

這里進行encode時使用了latin1。

  • Latin1是ISO-8859-1的別名,有些環境下寫作Latin-1。ISO-8859-1編碼是單字節編碼,向下兼容ASCII,其編碼范圍是0x00-0xFF,0x00-0x7F之間完全和ASCII一致,0x80-0x9F之間是控制字符,0xA0-0xFF之間是文字符號。
  • 因為ISO-8859-1編碼范圍使用了單字節內的所有空間,在支持ISO-8859-1的系統中傳輸和存儲其他任何編碼的字節流(bytes)都不會被拋棄。換言之,把其他任何編碼的字節流當作ISO-8859-1編碼看待都沒有問題。

總結

以上是生活随笔為你收集整理的Python3爬虫之中文乱码问题分析与解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。