menu trigger
訂閱電子報
訂閱
1.2_解析器之間的差異
2019/05/24
F5 學程式

 

解析器之間的區別:

 


BeautifulSoup提供了不同的解析器,但解析器本身是有區別的,同一篇的HTML檔被不同的解析器解析後可能會生成不同的結果,區別最大的是HTML解析器和XML解析器,看以下片段被解析成HTML結構:

 

BeautifulSoup("<a><b /></a>")

 

輸出結果:

 

<html><head></head><body><a><b></b></a></body></html>

 

因為空標籤<b />不符合標準,所以解析器把它解析成<b></b>。而同樣的片段使用XML解析如下:

(解析XML需要安裝lxml函式庫)

 

BeautifulSoup("<a><b /></a>", "xml")

 

輸出結果:

 

<?xml version="1.0" encoding="utf-8"?>
<a><b/></a>

 

但空標籤<b />依然被保留,並且檔案前添加了XML,而不是被包含在<html>標籤內。

 

HTML解析器之間也有區別,如果被解析的HTML檔是標準格式,那麼解析器之間就沒有任何差別,只是解析速度不同,結果都會返回正確的檔案結構。但是如果被解析檔案不是標準格式,那麼不同的解析器返回結果可能不同。下面例子中,使用lxml解析錯誤格式的檔案:

 

BeautifulSoup("<a></p>", "lxml")

 

輸出結果:

 

<html><body><a></a></body></html>

 

結果</p>標籤被直接忽略掉了 

 

使用html5lib函式庫解析相同檔案會得到不同的檔案結構:

 

BeautifulSoup("<a></p>", "html5lib")

 

輸出結果:

 

<html><head></head><body><a><p></p></a></body></html>

 

html5lib函式庫沒有忽略掉</p>標籤,而是自動補了標籤,還給檔案添加了<head>標籤。

 

使用pyhton內建函式庫解析結果如下:

 

BeautifulSoup("<a></p>", "html.parser")

 

輸出結果:

 

# <a></a>

 

結果與lxml函式庫類似,Python內建函式庫忽略掉了</p>標籤,而與html5lib函式庫不同的是,html.parser並沒有嘗試創建符合標準的html格式或將片段包含在<body>標籤內,而html.parser與lxml不同的是,html.parser甚至連<html>標籤都沒有嘗試去添加。

 

因為檔案片段"<a></p>"是錯誤格式,所以以上解析方式都算接近測試所打的程式碼,而html5lib函式庫使用的是HTML5的部分標準,所以最接近測試所打的程式碼。不過所有解析器的結構都能夠被認為是"正常"的解析。

 

結論:

 


所以不同的解析器可能影響代碼執行結果,如果在分發給別人的代碼中使用了BeautifulSoup,那麼最好註明使用了哪種解析器,以減少不必要的麻煩。

 

下一篇:1.3 快速開始

上一篇:1.1 如何安裝Python套件