Beautiful Soup - 指定解析器



一個 HTML 文件樹被解析成 BeautifulSoup 類的物件。此類的建構函式需要一個強制引數,即 HTML 字串或指向 html 檔案的檔案物件。建構函式還有其他可選引數,其中重要的是 features。

BeautifulSoup(markup, features)

這裡 markup 是一個 HTML 字串或檔案物件。features 引數指定要使用的解析器。它可以是特定的解析器,例如 "lxml"、"lxml-xml"、"html.parser" 或 "html5lib";或者是要使用的標記型別("html"、"html5"、"xml")。

如果未給出 features 引數,Beautiful Soup 會選擇已安裝的最佳 HTML 解析器。Beautiful Soup 將 lxml 的解析器評為最佳,然後是 html5lib 的解析器,最後是 Python 的內建解析器。

您可以指定以下內容之一 -

您要解析的標記型別。Beautiful Soup 當前支援 "html"、"xml" 和 "html5"。

要使用的解析器庫的名稱。當前支援的選項是 "lxml"、"html5lib" 和 "html.parser"(Python 的內建 HTML 解析器)。

要安裝 lxml 或 html5lib 解析器,請使用以下命令 -

pip3 install lxml
pip3 install html5lib

這些解析器各有優缺點,如下所示 -

解析器:Python 的 html.parser

用法 - BeautifulSoup(markup, "html.parser")

優點

  • 內建
  • 速度適中
  • 寬容(自 Python 3.2 起)

缺點

  • 速度不如 lxml 快,寬容度不如 html5lib 高。

解析器:lxml 的 HTML 解析器

用法 - BeautifulSoup(markup, "lxml")

優點

  • 非常快
  • 寬容

缺點

  • 外部 C 依賴

解析器:lxml 的 XML 解析器

用法 - BeautifulSoup(markup, "lxml-xml")

或 BeautifulSoup(markup, "xml")

優點

  • 非常快
  • 唯一當前支援的 XML 解析器

缺點

  • 外部 C 依賴

解析器:html5lib

用法 - BeautifulSoup(markup, "html5lib")

優點

  • 極其寬容
  • 以與 Web 瀏覽器相同的方式解析頁面
  • 建立有效的 HTML5

缺點

  • 非常慢
  • 外部 Python 依賴

不同的解析器會從同一文件建立不同的解析樹。HTML 解析器和 XML 解析器之間的差異最大。這是一個簡短的文件,以 HTML 格式解析 -

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a><b /></a>", "html.parser")
print (soup)

輸出

<a><b></b></a>

空的 <b /> 標籤不是有效的 HTML。因此,解析器將其轉換為 <b></b> 標籤對。

現在以 XML 格式解析同一文件。請注意,空 <b /> 標籤保持不變,並且該文件被賦予 XML 宣告而不是放入 <html> 標籤中。

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a><b /></a>", "xml")
print (soup)

輸出

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

對於格式良好的 HTML 文件,所有 HTML 解析器都會產生類似的解析樹,儘管一個解析器會比另一個解析器快。

但是,如果 HTML 文件不完美,則不同型別的解析器將產生不同的結果。請檢視當 "<a></p>" 使用不同的解析器解析時結果有何不同 -

lxml 解析器

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a></p>", "lxml")
print (soup)

輸出

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

請注意,懸空的 </p> 標籤被簡單地忽略了。

html5lib 解析器

示例

from bs4 import BeautifulSoup

soup = BeautifulSoup("<a></p>", "html5lib")
print (soup)

輸出

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

html5lib 將其與一個起始 <p> 標籤配對。此解析器還向文件添加了一個空的 <head> 標籤。

內建 html 解析器

示例

Built in from bs4 import BeautifulSoup

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

輸出

<a></a>

此解析器也忽略了結束 </p> 標籤。但此解析器沒有嘗試透過新增 <body> 標籤來建立格式良好的 HTML 文件,甚至沒有費心新增 <html> 標籤。

html5lib 解析器使用 HTML5 標準的一部分的技術,因此它對成為“正確”方式的說法最有依據。

廣告