如何使用 Python 解析 HTML

这一次,我将带你了解如何使用三种流行工具解析 HTML:BeautifulSoup、lxml 和 html.parser。每一种工具都有其独特优势,我会向你展示如何充分利用它们。无论你是刚入门,还是希望提升技能,这些工具都会让 HTML 解析变得简单而高效。让我们开始吧!

为什么要解析 HTML?

在深入了解工具和代码之前,我们先来理解为什么需要解析 HTML。当你访问一个网页时,你看到的内容是通过 HTML 标签进行结构化的。这些标签定义了标题、段落、图片、链接和其他元素。如果你想从网页中提取特定信息,比如标题、商品价格或评论,就必须查看 HTML 结构来找到这些信息。然而,手动查看 HTML 可能很繁琐,尤其是在处理大型网页或多个网页时。这时解析工具就非常有用,它们可以自动定位并提取所需数据。

跳过手动解析

你可以选择爬虫 API 或数据集提供商来满足所有数据需求,从而轻松跳过手动抓取。一些优秀的网页数据提供商包括:

  1. Bright Data:基于强大代理的抓取方案,适用于复杂需求。

  2. ScraperAPI:价格实惠,为未受保护的网站提供多语言支持。

  3. Oxylabs:高质量代理,基于 AI 的数据解析。

如需查看完整列表,请访问我关于顶级爬虫 API 的文章。

Python 中用于解析 HTML 的工具

Python 有多个可以处理 HTML 解析的库。每个库都有自己的优势和使用场景。下面,我们将介绍三个流行的库:BeautifulSoup、lxml 和 html.parser。

BeautifulSoup

BeautifulSoup 是最受欢迎的 Python HTML 和 XML 解析库之一。它简化了从网页中提取数据的过程,让你可以快速浏览 HTML 结构并获取所需信息。

安装:

在使用 BeautifulSoup 之前,你需要先安装它。你可以使用 Python 的包安装器 pip 来完成安装:

pip install beautifulsoup4

此外,BeautifulSoup 通常与 requests 库配合使用效果很好,requests 可以让你轻松从网页获取 HTML 内容:

pip install requests

如何使用 BeautifulSoup:

我们先从一个使用 BeautifulSoup 解析 HTML 的示例开始。在这个例子中,我们将提取网页的标题。

import requests

from bs4 import BeautifulSoup

Fetch the HTML content of the webpage

url = "https://example.com"

response = requests.get(url)

Parse the HTML content using BeautifulSoup

soup = BeautifulSoup(response.text, "html.parser")

Extract the title of the webpage

title = soup.title.text

print("Page Title:", title)

在这段代码中:

  • 我们使用 requests.get 获取网页的 HTML。

  • 使用 BeautifulSoup 解析 HTML 内容。

  • 然后使用 soup.title 提取页面标题。

浏览 HTML 结构:

解析完 HTML 后,你可以使用 BeautifulSoup 提供的不同方法在其中进行浏览。例如:

  • soup.find 允许你查找某个 HTML 标签的第一次出现。

  • soup.find_all 返回某个特定标签所有出现项的列表。

下面看看如何从网页中提取所有链接( 标签):

links = soup.find_all('a')

for link in links:

print(link.get('href'))

这段代码会打印网页上找到的所有超链接(URL)。

lxml

lxml 库是 Python 中另一个用于解析 HTML 和 XML 的强大工具。它以速度和准确性著称。如果性能是优先考虑因素,lxml 可能比 BeautifulSoup 更适合。

安装:

要安装 lxml,可以使用 pip:

pip install lxml

如何使用 lxml:

在你的收件箱中获取 Data Journal 的文章

免费加入 Medium,获取这位作者的更新。

记住我,以便更快登录

下面是一个使用 lxml 解析 HTML 的示例:

from lxml import html

import requests

Fetch the HTML content

url = "https://example.com"

response = requests.get(url)

Parse the HTML content using lxml

tree = html.fromstring(response.content)

Extract the title of the webpage

title = tree.findtext('.//title')

print("Page Title:", title)

在这个示例中:

  • 我们使用 lxml 中的 html 模块来解析网页内容。

  • findtext 函数会检索 标签内的文本。

在 lxml 中使用 XPath:

XML 的关键特性之一是支持 XPath,这是一种用于查询 XML 和 HTML 文档的强大语言。与标准的基于标签的搜索相比,XPath 让你能够更灵活地在 HTML 文档中导航。

下面是一个使用 XPath 从网页中提取所有链接的示例:

# Extract all links using XPath

links = tree.xpath('//a/@href')

for link in links:

print(link)

这段代码使用 XPath 表达式 //a/@href 来查找所有 标签,并提取它们 href 属性的值(其中包含 URL)。

html.parser

Python 内置的 html.parser 模块也是解析 HTML 的一种选择。虽然它可能没有 BeautifulSoup 或 lxml 那么快,也没有那么丰富的功能,但对于基础任务来说仍然是一个可行选项,而且由于它是 Python 标准库的一部分,不需要额外安装。

如何使用 html.parser:

下面是一个使用 html.parser 解析网页的示例:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):

def handle_starttag(self, tag, attrs):

print("Start tag:", tag)

def handle_endtag(self, tag):

print("End tag:", tag)

def handle_data(self, data):

print("Data:", data)

Sample HTML to parse

html_content = """

<html>

<head><title>Example</title></head>

<body><p>Hello, world!</p></body>

</html>

"""

Create an instance of the parser and feed it the HTML content

parser = MyHTMLParser()

parser.feed(html_content)

在这个示例中:

  • 我们继承 HTMLParser 来创建自定义解析器。

  • 重写 handle_starttag、handle_endtag 和 handle_data 方法,以处理 HTML 内容的不同部分。

这个解析器会输出有关开始标签、结束标签以及标签之间数据的信息。

库的比较

既然我们已经了解了三种不同的 HTML 解析工具,下面比较它们,以理解各自的优点和不足。

BeautifulSoup:

  • 易用性:它非常易于使用,即使对初学者也很友好。

  • 灵活性:既能处理简单解析任务,也能处理复杂解析任务。

  • 性能:速度不如 lxml,尤其是在处理大型文档时。

lxml:

  • 速度:是解析 HTML 速度最快的库之一。

  • 准确性:非常准确,尤其是在处理格式不规范的 HTML 时。

  • XPath 支持:支持使用 XPath 进行复杂查询。

html.parser:

  • 内置:无需外部库;它随 Python 一起提供。

  • 基础解析:适合简单解析任务,但缺少 BeautifulSoup 和 lxml 的强大功能与灵活性。

选择合适的工具

解析 HTML 的最佳工具取决于你的具体需求:

  • 如果你需要快速且简单的方案,并且不想安装额外库,html.parser 是一个不错的选择。

  • 如果你正在处理大型、复杂的文档,或者需要高性能,lxml 很可能是最佳选择。

  • 如果你想要一个易用、通用且拥有广泛社区支持的库,BeautifulSoup 是一个很好的选择。

高级解析技术

对于更高级的使用场景,你可能需要将这些库与其他工具结合使用。例如:

  • 你可以使用 BeautifulSoup 轻松浏览 HTML 结构,并将其与 requests 结合,从动态网站获取数据。

  • 如果需要与使用 JavaScript 加载内容的网站交互,你可能需要使用 Selenium 或 Playwright 等工具先渲染页面,然后再解析 HTML。

下面是一个将 BeautifulSoup 与 Selenium 结合使用来抓取动态内容的示例:

from selenium import webdriver

from bs4 import BeautifulSoup

Set up the Selenium driver (ensure you have a driver like ChromeDriver installed)

driver = webdriver.Chrome()

Open the webpage

url = "https://example.com"

driver.get(url)

Get the page source after JavaScript has loaded the content

html_content = driver.page_source

Parse the HTML using BeautifulSoup

soup = BeautifulSoup(html_content, "html.parser")

Extract the title

title = soup.title.text

print("Page Title:", title)

Close the Selenium driver

driver.quit()

在这段代码中:

  • 使用 Selenium 打开网页并允许 JavaScript 执行。

  • 使用 BeautifulSoup 解析 HTML 内容并提取所需数据。

结论

在处理网页抓取、数据提取或自动化项目时,解析 HTML 是一项重要技能。Python 提供了多个强大的库,例如 BeautifulSoup、lxml 和 html.parser,使这项任务变得简单直接。你可以根据项目需求选择最适合的库。BeautifulSoup 非常适合初学者和快速项目,而 lxml 则为更复杂的任务提供速度优势和强大的 XPath 支持。内置的 html.parser 适合更简单的需求,以及希望避免外部依赖的情况。

通过了解每个工具的优势以及使用方法,你可以高效解析 HTML,并从网页中提取所需数据。

相关推荐
外收内放1 小时前
面向对象高级(封装)
开发语言·python
全栈练习生1 小时前
大模型原理之投机解码
python·ai
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:差分数组与区间修改实战解析
c++·python·算法·bfs·信息学竞赛
小小张说故事1 小时前
Python 的 sort 为什么又稳又快?拆开 Timsort:run 检测、minrun 与 galloping 的三板斧
python
kaizq1 小时前
从照片开口说话实现到应用职业教培变革落地
python·应用职业教育·ai混元-元宝·数学学习基础·用中学-学中用·照片aigc-gif
OnlineProxy2 小时前
Python 高负载异步爬虫优化指南:深挖 httpx 与 aiohttp 的性能极限
爬虫·python·httpx
零基础1232 小时前
基于模型的强化学习与不基于模型的强化学习:核心区别与实战选择
python·算法
我命由我123452 小时前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
专业程序开发源2 小时前
django视听资源推荐系统16690-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计