一。 爲何要用解析框架 bs4html
我以爲爬蟲最可貴問題就是編碼格式,由於你不知道要爬取目標網站的編碼格式,有多是Unicode,utf-8, ASCII , gbk格式,可是使用Beautiful Soup解析後,文檔都被轉換成了Unicode,經過Beautiful Soup輸出文檔時,無論輸入文檔是什麼編碼方式,輸出編碼均爲UTF-8編碼, 由於 Beautiful Soup用了 編碼自動檢測 子庫來識別當前文檔編碼並轉換成Unicode編碼。框架
編碼自動檢測 功能大部分時候都能猜對編碼格式,但有時候也會出錯.有時候即便猜想正確,也是在逐個字節的遍歷整個文檔後才猜對的,這樣很慢.若是預先知道文檔編碼,能夠設置編碼參數來減小自動檢查編碼出錯的機率而且提升文檔解析速度.在建立 BeautifulSoup 對象的時候設置 from_encoding 參數網站
下面一段文檔用了ISO-8859-8編碼方式,這段文檔過短,結果Beautiful Soup覺得文檔是用ISO-8859-7編碼:ui
markup = b"<h1>\xed\xe5\xec\xf9</h1>" soup = BeautifulSoup(markup) soup.h1 <h1>νεμω</h1> soup.original_encoding 'ISO-8859-7'
經過傳入 from_encoding 參數來指定編碼方式:編碼
soup = BeautifulSoup(markup, from_encoding="iso-8859-8") soup.h1 <h1>םולש</h1> soup.original_encoding 'iso8859-8'
下面例子輸入文檔是Latin-1編碼:spa
markup = b''' <html> <head> <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" /> </head> <body> <p>Sacr\xe9 bleu!</p> </body> </html> ''' soup = BeautifulSoup(markup) print(soup.prettify()) # <html> # <head> # <meta content="text/html; charset=utf-8" http-equiv="Content-type" /> # </head> # <body> # <p> # Sacré bleu! # </p> # </body> # </html>
若是不想用UTF-8編碼輸出,能夠將編碼方式傳入 prettify() 方法:code
print(soup.prettify("latin-1")) # <html> # <head> # <meta content="text/html; charset=latin-1" http-equiv="Content-type" /> # ...
還能夠調用 BeautifulSoup 對象或任意節點的 encode() 方法,就像Python的字符串調用 encode() 方法同樣:htm
soup.p.encode("latin-1") # '<p>Sacr\xe9 bleu!</p>' soup.p.encode("utf-8") # '<p>Sacr\xc3\xa9 bleu!</p>'