我们使用联盟链接。它们让我们能够维持运营,而您无需承担任何费用。

最好的 Python HTML 解析器

如果人们无法阅读和分析爬取的网页数据,那么这些数据对他们来说就没什么用。这时 HTML 解析器就发挥了至关重要的作用——它们只从下载的原始数据中提取有意义的部分,并对其进行清理以提高可读性。

最好的 Python HTML 解析器

Python 是最容易学习的编程语言之一,但尽管如此,它还是非常适合网页抓取,并且有许多库可以扩展其功能。例如,市场上有多个 HTML 解析器库,因此选择最适合您的抓取项目的库可能很棘手。在本文中,您将找到有关 Python HTML 解析器的所有信息:它们是什么、它们如何工作以及哪些解析器最容易设置和使用。

什么是 HTML 解析?

HTML 解析是指从 HTML 代码中仅提取相关信息。这意味着原始 HTML 数据(包括标记标签、错误或其他不相关的信息)被清理、结构化并修改为有意义的数据点或内容。

例如,假设您非常喜欢这篇文章,并希望提取最佳解析器列表以供离线阅读。虽然您可以将网站下载为 HTML 文件,但由于 HTML 标签太多,阅读起来会很棘手。相反,通过使用网页抓取工具提取下面的列表并使用 HTML 解析器对其进行处理,您将只获得干净格式的相关内容。 

为什么要解析 HTML 数据?

解析通过删除所有必要或损坏的信息来提高 HTML 数据的可读性。为了说明 HTML 解析的作用,让我们将原始 HTML 与解析后的数据进行比较。 

以下是一个简单 HTML 网站的代码:

				
					<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Welcome to My Website</h1>
    <p>This is an example paragraph.</p>
    <a href="https://example.com">Click here</a>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  </body>
</html>

				
			

您的浏览器会使用代码,并将其“翻译”成对人类更具视觉吸引力和功能性的内容。以下是您的浏览器以视觉方式呈现此代码的方式。

浏览器呈现的网站示例
注意:网站看起来有所不同。此快照仅用于说明目的。

如您所见,代码包含如下 HTML 元素: , 。虽然这些数据对于浏览器正确显示网站很重要,但对人类来说并不是特别有用。我们感兴趣的是网站的名称、链接和要点中的数据。

通过使用像 BeautifulSoup 这样的 Python HTML 解析器,我们可以删除不相关的信息片段,并将原始 HTML 转换为结构化的、可读的数据,如下所示:

				
					Title: My Website
H1 Heading: Welcome to My Website
Paragraph: This is an example paragraph.
Link: https://example.com
List Items: ['Item 1', 'Item 2', 'Item 3']

				
			

在这种情况下,解析器删除了 HTML 元素并结构化了最重要的数据点。结果包括更少的代码行、整齐排列的列表项和保留的链接,尽管“单击此处”文本已被删除。重要的是,没有丢失任何相关信息。这些结构化数据对我们来说更容易阅读,并且可以进一步操作或分析。

现在,让我们看一下与 Python 抓取工具一起使用的最佳 HTML 解析器。

2026 年最佳 Python HTML 解析器

1. 美丽汤

最流行的 Python 解析库。​

BeautifulSoup 是用于解析的最流行的 Python 库之一。它轻量、多功能且相对容易学习。

BeautifulSoup 是一个强大的 HTML 和 XML 解析器,可以将原始 HTML 文档转换为 Python 分析树 (一种基于 Python 规则分解结构和语法的分层树模型),然后从中提取相关信息。您还可以根据需要浏览、搜索和修改这些树。BeautifulSoup 还非常适合处理格式不正确或损坏的 HTML - 它可以识别错误、正确解释格式错误的 HTML 并进行修复。

由于 BeautifulSoup 是一个 HTML 操作库,因此它不能单独工作。要呈现静态内容,您需要一个 HTTP 客户端,例如 要求 获取网页进行解析。动态内容也是如此——您必须使用无头浏览器,例如 or 剧作家.

该图书馆非常受欢迎且维护良好,因此您会发现一个活跃的社区和丰富的文档来帮助您。

要安装 BeautifulSoup,你只需运行 点安装beautifulsoup4 在您的终端中。 

让我们看看如何使用 BeautifulSoup 来解析我们简单的 HTML 网站。

				
					from bs4 import BeautifulSoup

html_code = """
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Welcome to My Website</h1>
    <p>This is an example paragraph.</p>
    <a href="https://example.com">Click here</a>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  </body>
</html>
"""

soup = BeautifulSoup(html_code, 'html.parser')

title = soup.title.string
h1 = soup.h1.string
paragraph = soup.p.string
link_text = soup.a.string
link_href = soup.a['href']
list_items = [li.string for li in soup.find_all('li')]

print("Title:", title)
print("Heading (h1):", h1)
print("Paragraph:", paragraph)
print("Link Text:", link_text)
print("Link Href:", link_href)
print("List Items:", list_items)

				
			

最终解析的结果如下:

				
					results = {
    "Title": "My Website",
    "Heading (h1)": "Welcome to My Website",
    "Paragraph": "This is an example paragraph.",
    "Link Text": "Click here",
    "Link Href": "https://example.com",
    "List Items": ["Item 1", "Item 2", "Item 3"]
}

for key, value in results.items():
    print(f"{key}: {value}")

				
			

2.lmxl

一个高效的 HTML 和 XML 文档解析库。​

lxml 库可能是解析原始 HTML 和 XML 数据最有效的库之一。它速度快、性能好,非常适合处理大型 HTML 文档。

lxml 库将 Python 与强大的 C 库连接起来,用于处理 HTML 和 XML。它将原始数据转换为可以使用的对象 XPath的 or 的CSS 选择器。但是,由于它是一个静态解析器,因此您需要一个无头浏览器来处理动态内容。虽然 lxml 非常快,但如果您不熟悉 XPath 查询,学习起来会比较困难。

通过运行安装 lxml pip 安装 lxml 在你的终端中,并添加 从 lxml 导入 html 在您的抓取项目中。

以下是 lxml 解析简单网站的方法:

				
					from lxml import html

html_code = """
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Welcome to My Website</h1>
    <p>This is an example paragraph.</p>
    <a href="https://example.com">Click here</a>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  </body>
</html>
"""
tree = html.fromstring(html_code)

title = tree.xpath('//title/text()')[0]
h1 = tree.xpath('//h1/text()')[0]
paragraph = tree.xpath('//p/text()')[0]
link_text = tree.xpath('//a/text()')[0]
link_href = tree.xpath('//a/@href')[0]
list_items = tree.xpath('//ul/li/text()')

print("Title:", title)
print("Heading (h1):", h1)
print("Paragraph:", paragraph)
print("Link Text:", link_text)
print("Link Href:", link_href)
print("List Items:", list_items)

				
			

解析结果如下:

				
					Title: My Website
Heading (h1): Welcome to My Website
Paragraph: This is an example paragraph.
Link Text: More information...
Link Href: https://www.example.com
List Items: ['Item 1', 'Item 2', 'Item 3']

				
			

3. PyQuery

使用 jQuery 语法解析 HTML 和 XML 文档的库。​

PyQuery 是另一个用于解析和处理 HTML 和 XML 文档的 Python 库。它的语法与 jQuery 类似,因此如果您已经熟悉该库,那么它是一个不错的选择。 

PyQuery 非常直观 - CSS 样式的选择器使浏览文档以及提取或修改 HTML 和 XML 内容变得容易。PyQuery 还允许您创建文档树以便于数据提取。它的工作原理与 BeautifulSoup 和 lmxl 类似:您可以将 HTML 或 XML 文档加载到 Python 对象中并使用 jQuery 样式的命令 与之交互,因此关键区别在于语法。PyQuery 还有很多辅助函数,因此您不必自己编写那么多代码。

该库对于静态内容很有效,但它本身不能处理动态内容 - 它需要 无头浏览器 在解析内容之前呈现 JavaScript 驱动的页面。

要安装 PyQuery,请运行 pip 安装 pyquery 在你的终端中,添加 从 pyquery 导入 PyQuery 作为 pq 在您的项目中使用它。

下面是一个如何使用 PyQuery 解析简单 HTML 文档的示例:

				
					from pyquery import PyQuery as pq

html_code = """
<html>
  <head>
    <title>My Website</title>
  </head>
  <body>
    <h1>Welcome to My Website</h1>
    <p>This is an example paragraph.</p>
    <a href="https://example.com">Click here</a>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  </body>
</html>
"""

doc = pq(html_code)

title = doc("title").text()
h1 = doc("h1").text()
paragraph = doc("p").text()
link_text = doc("a").text()
link_href = doc("a").attr("href")
list_items = [li.text() for li in doc("ul li").items()]

print("Title:", title)
print("Heading (h1):", h1)
print("Paragraph:", paragraph)
print("Link Text:", link_text)
print("Link Href:", link_href)
print("List Items:", list_items)

				
			

PyQuery 打印结果的方式如下:

				
					Title: My Website
Heading (h1): Welcome to My Website
Paragraph: This is an example paragraph.
Link Text: More information...
Link Href: https://www.example.com
List Items: ['Item 1', 'Item 2', 'Item 3']

				
			

4. 请求-html

支持静态和动态内容的解析库。​

request-html 是一个 Python HTML 解析库,能够渲染支持静态和动态内容的 HTML。它结合了 要求 库(用于获取网页的 HTTP 客户端)具有无头浏览器的 JavaScript 渲染能力,因此您可以使用的库更少。

使用requests-html,你可以轻松地 发送 HTTP 请求 到网页并接收完全呈现的 HTML。requests-html 非常适合静态页面,因为您可以使用一个包发送请求并解析原始数据。然而,该库脱颖而出,因为它可以 抓取基于 JavaScript 的网页也一样——它依赖 Chromium 网络浏览器来原生处理动态内容。此外,它有多种解析策略,包括 CSS 选择器和 XPath,因此非常方便。

request-html 还支持多线程请求,因此您可以同时与多个网页交互。然而,这使得它更难学习,并且由于需要额外的处理能力来呈现 JavaScript,它比传统解析器慢得多。

要安装 request-html,请运行 pip 安装请求-html 在您的终端中。安装后,添加 从requests_html导入HTMLSession 到你的抓取项目。

以下是如何使用 request-html 解析一个简单的网站:

				
					from requests_html import HTMLSession
session = HTMLSession()

response = session.get('https://example.com')

doc = response.html

title = doc.find('title', first=True).text
h1 = doc.find('h1', first=True).text
paragraph = doc.find('p', first=True).text
link_text = doc.find('a', first=True).text
link_href = doc.find('a', first=True).attrs['href']
list_items = [li.text for li in doc.find('ul li')]

print("Title:", title)
print("Heading (h1):", h1)
print("Paragraph:", paragraph)
print("Link Text:", link_text)
print("Link Href:", link_href)
print("List Items:", list_items)

				
			

解析的结果将如下所示:

				
					Title: My Website
Heading (h1): Welcome to My Website
Paragraph: This is an example paragraph.
Link Text: More information...
Link Href: https://www.example.com
List Items: ['Item 1', 'Item 2', 'Item 3']

				
			

Python HTML 解析器之间的差异

HTML 解析器的选择取决于您的项目需求 - 虽然有些项目可能需要原生 JavaScript 渲染,但有些项目可以不用原生 JavaScript 渲染。此外,请检查速度和效率是否符合您的期望。以下是这些库的比较:

图书馆

速度

易用性

本机动态内容处理

理想的用例

美丽汤

快速

好简单

没有

简单 HTML 解析

xml文件

速度非常快

没有

快速解析

查询

快速

简便

没有

使用 CSS 选择器进行抓取

请求-html

快速(静态内容);中等(动态内容)

简便

抓取并解析动态网页

简而言之,使用 美丽汤 or xml文件 静态 HTML 内容。它们效率高,而且相对容易学习。如果你想处理动态内容,请使用 请求-html 集成了无头浏览器。如果您打算使用 CSS 选择器进行抓取,请使用 查询 以便于导航和数据操作。 

Adam Dubois 的图片
亚当·杜波依斯
代理极客和开发人员。