一.解析器概述
如同前幾章筆記,當我們輸入:
soup=BeautifulSoup(response.body)
對網頁進行析取時,並未規定解析器,此時使用的是python內部默認的解析器“html.parser”。
解析器是什么呢? BeautifulSoup做的工作就是對html標簽進行解釋和分類,不同的解析器對相同html標簽會做出不同解釋。
舉個官方文檔上的例子:
BeautifulSoup("<a></p>", "lxml") # <html><body><a></a></body></html>
BeautifulSoup("<a></p>", "html5lib") # <html><head></head><body><a><p></p></a></body></html>
BeautifulSoup("<a></p>", "html.parser") # <a></a>
官方文檔上多次提到推薦使用"lxml"和"html5lib"解析器,因為默認的"html.parser"自動補全標簽的功能很差,經常會出問題。
二.不同解析器的對比
Parser | Typical usage | Advantages | Disadvantages |
Python’s html.parser | BeautifulSoup(markup, "html.parser") |
|
|
lxml’s HTML parser | BeautifulSoup(markup, "lxml") |
|
|
lxml’s XML parser | BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup,"xml") |
|
|
html5lib | BeautifulSoup(markup, "html5lib") |
|
|
可以看出,“lxml”的解析速度非常快,對錯誤也有一定的容忍性。“html5lib”對錯誤的容忍度是最高的,而且一定能解析出合法的html5代碼,但速度很慢。
我在實際爬取網站的時候,原網頁的編碼方式不統一,其中有一句亂碼,用“html.parser”和“lxml”都解析到亂碼的那句,后面的所有標簽都被忽略了。而“html5lib”能夠完美解決這個問題。
三.from_encoding參數 (對應BeautifulSoup3中的fromEncoding參數)
由於不同網站的編碼方式不同,在用BeautifulSoup進行解析時,要注明對應的編碼方式。
查看編碼方式的方法如下:
import chardet chardet.detect(response.body)
如:得到
{'confidence': 0.99, 'encoding': 'GB2312'}
由此可知編碼方式為GB2312,在析取時,默認的from_encoding參數為utf-8,不是utf-8的應注明。即:
soup=BeautifulSoup(respone.body,"html5lib",from_encoding='gb2312')