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

最好的 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>`和`<body>`之类的 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 客户端(例如requests)来获取网页进行解析。动态内容也是如此——你需要使用像Selenium或Playwright这样的无头浏览器。

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

要安装 BeautifulSoup,你只需要在终端中运行pip install 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或CSS选择器进行导航的对象。但是,由于它是一个静态解析器,因此对于动态内容,您需要一个无头浏览器。虽然 lxml 速度非常快,但如果您不熟悉 XPath 查询,学习起来可能会比较困难。

在终端中运行pip install lxml来安装 lxml ,然后在抓取项目中添加from lxml import 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 install pyquery ,然后在项目中添加from pyquery import PyQuery as 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

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

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

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

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

要安装 requests-html,请在终端运行`pip install requests-html` 。安装完成后,将`from requests_html import 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

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

简便

是

抓取并解析动态网页

简而言之,对于静态 HTML 内容,请使用BeautifulSoup或lxml 。它们效率高且相对容易学习。如果需要处理动态内容,请使用requests-html ,它集成了一个无头浏览器。如果您计划使用 CSS 选择器进行抓取,请使用PyQuery ,它便于导航和数据操作。

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