最好的 Python HTML 解析器
如果人们无法阅读和分析爬取的网页数据,那么这些数据对他们来说就没什么用。这时 HTML 解析器就发挥了至关重要的作用——它们只从下载的原始数据中提取有意义的部分,并对其进行清理以提高可读性。
Python 是最容易学习的编程语言之一,但尽管如此,它还是非常适合网页抓取,并且有许多库可以扩展其功能。例如,市场上有多个 HTML 解析器库,因此选择最适合您的抓取项目的库可能很棘手。在本文中,您将找到有关 Python HTML 解析器的所有信息:它们是什么、它们如何工作以及哪些解析器最容易设置和使用。
什么是 HTML 解析?
HTML 解析是指从 HTML 代码中仅提取相关信息。这意味着原始 HTML 数据(包括标记标签、错误或其他不相关的信息)被清理、结构化并修改为有意义的数据点或内容。
例如,假设您非常喜欢这篇文章,并希望提取最佳解析器列表以供离线阅读。虽然您可以将网站下载为 HTML 文件,但由于 HTML 标签太多,阅读起来会很棘手。相反,通过使用网页抓取工具提取下面的列表并使用 HTML 解析器对其进行处理,您将只获得干净格式的相关内容。
为什么要解析 HTML 数据?
解析通过删除所有必要或损坏的信息来提高 HTML 数据的可读性。为了说明 HTML 解析的作用,让我们将原始 HTML 与解析后的数据进行比较。
以下是一个简单 HTML 网站的代码:
My Website
Welcome to My Website
This is an example paragraph.
Click here
- Item 1
- Item 2
- Item 3
您的浏览器会使用代码,并将其“翻译”成对人类更具视觉吸引力和功能性的内容。以下是您的浏览器以视觉方式呈现此代码的方式。
如您所见,代码中包含诸如`<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 = """
My Website
Welcome to My Website
This is an example paragraph.
Click here
- Item 1
- Item 2
- Item 3
"""
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 = """
My Website
Welcome to My Website
This is an example paragraph.
Click here
- Item 1
- Item 2
- Item 3
"""
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 = """
My Website
Welcome to My Website
This is an example paragraph.
Click here
- Item 1
- Item 2
- Item 3
"""
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 ,它便于导航和数据操作。