返回博客
指南
安德烈·奥吉奥兰2023年4月11日阅读时间:10分钟

了解如何使用 Python 抓取 HTML 表格

了解如何使用 Python 抓取 HTML 表格

导言

网络爬虫是一种强大的工具,它允许您从网站中提取数据,并将其用于各种用途,例如数据挖掘、数据分析和机器学习。 网页抓取中的一项常见任务是从 HTML 表格中提取数据。这类表格常见于各类网站,用于以结构化、表格化的形式呈现数据。在本文中,我们将学习如何使用 Python 从 HTML 表格中抓取数据,并将其存储为便于处理和分析的格式。

读完本文后,您将掌握构建自己的网页爬虫所需的技能和知识,该爬虫能够从 HTML 表格中提取数据,并将其用于多种用途。无论您是希望为下一个项目收集数据的数据科学家,还是希望为市场调研收集数据的企业主,抑或是希望构建自己的网页爬虫工具的开发者,本文都将为您提供一份宝贵的资源,助您入门使用 Python 进行 HTML 表格爬取。

什么是 HTML 表格?

HTML tables are a type of element in HTML (Hypertext Markup Language) that is used to represent tabular data on a web page. An HTML table consists of rows and columns of cells, which can contain text, images, or other HTML elements. HTML tables are created using the table element, and are structured using the ‘<tr>’ (table row) ,‘<td>’ (table cell), ‘<th>’ (table header), ‘<caption>’ , ‘<col>’, ‘<colgroup>’, ‘<tbody>’ (table body), ‘<thead>’ (table head) and ‘<tfoot>’ (table foot) elements. Now let’s go through each one and get in more detail:

  • table 元素:定义 HTML 表格的起始和结束。
  • tr(表格行)元素:定义HTML表格中的一行。
  • td(表格单元格)元素:定义HTML表格中的一个单元格。
  • th(表格标题)元素:用于定义HTML表格中的标题单元格。标题单元格默认以粗体显示并居中对齐,用于标注表格的行或列。
  • caption 元素:用于为 HTML 表格定义标题。该标题通常显示在表格上方或下方。
  • col 和 colgroup 元素:用于定义 HTML 表格中各列的属性,例如宽度或对齐方式。
  • tbody、thead 和 tfoot 元素:分别定义 HTML 表格的主体、表头和表尾部分。这些元素可用于将行分组,并为表格的特定部分应用样式或属性。

为了更好地理解这个概念,让我们来看看 HTML 表格是什么样子的:

列出公司、联系人及国家的示例 HTML 表格

乍一看,这似乎是一个普通的表格,我们无法看到上述元素构成的结构。这并不意味着这些元素不存在,而是说明浏览器已经帮我们解析好了。为了查看 HTML 结构,你需要深入一步,使用开发者工具。 具体操作如下:右键点击页面,选择“检查”,点击“选择元素”工具,然后点击你想要查看其HTML结构的元素(本例中为表格)。完成这些步骤后,你应该会看到类似以下的内容:

包含示例表格的 HTML 表格教程页面,并配有浏览器开发者工具对表格标记的突出显示

HTML 表格通常用于以结构化的表格形式呈现数据,例如整理结果或显示数据库内容。它们广泛存在于各类网站中,也是从网络上抓取数据时需要重点考虑的重要元素。

设置

在开始从 HTML 表格中抓取数据之前,我们需要先配置好运行环境,并确保已安装所有必要的工具和库。第一步是确认您的计算机上已安装 Python。如果尚未安装 Python,您可以从 Python 官方网站(https://www.python.org/)下载,并按照说明进行安装。

接下来,我们需要安装一些有助于从 HTML 表格中抓取数据的库。Python 中最常用的网页抓取库包括Beautiful SoupSeleniumScrapy。本文将重点介绍 Beautiful Soup,因为与其他库相比,它的使用方法非常直观。 Beautiful Soup 是一个便于解析 HTML 和 XML 文档的库,特别适用于从网页中提取数据。虽然仅凭它足以抓取我们所需的 HTML 数据,但 HTML 格式对人眼而言并不太易读,因此您可能需要对数据进行某种形式的处理。此时,Pandas 库便派上了用场。

Pandas是一个数据分析库,它提供了处理结构化数据(例如 HTML 表格)的工具。您可以使用 Python 自带的pip包管理器安装这些库:

$ pip install beautifulsoup4 pandas

安装好 Python 和必要的库后,您就可以开始从 HTML 表格中抓取数据了。在下一节中,我们将逐步演示如何构建一个网络爬虫,它能够从 HTML 表格中提取数据,并以结构化格式进行存储。

让我们开始抓取数据吧

既然我们已经搭建好了运行环境,并对 HTML 表格有了基本的了解,现在就可以开始构建一个网络爬虫,用于从 HTML 表格中提取数据了。在本节中,我们将逐步演示如何构建一个简单的爬虫,它能够从表格中提取数据,并以结构化的格式进行存储。

第一步是使用requests库向包含我们要抓取的 HTML 表格的网页发送一个 HTTP 请求。

您可以像安装其他 Python 包一样,使用 pip 进行安装:

$ pip install requests

该库允许我们将网页的 HTML 内容作为字符串获取:

import requests

url = 'https://www.w3schools.com/html/html_tables.asp'

html = requests.get(url).text

接下来,我们将使用BeautifulSoup库来解析 HTML 内容,并从表格中提取数据。BeautifulSoup 提供了多种方法和属性,使我们能够轻松地遍历 HTML 文档并从中提取数据。以下是一个示例,演示如何使用它来查找表格元素并从单元格中提取数据:

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

# 查找 table 元素

table = soup.find('table')

# 从单元格中提取数据

data = []

for row in table.find_all('tr'):

   cols = row.find_all('td')

   # 提取表格标题

   if len(cols) == 0:

       cols = row.find_all('th')

   cols = [ele.text.strip() for ele in cols]

   data.append([ele for ele in cols if ele])  # 移除空值

print(data)

现在,这个二维数据数组中已填充了表格的行和列值。为了便于我们阅读,现在我们可以非常轻松地将这些内容转换为 Pandas DataFrame:

import pandas as pd

# 从数据数组中获取列名

# 为了让 Pandas 能正确解析数据,之后务必从数据数组中移除这些列名

headers = data.pop(0)

df = pd.DataFrame(data, columns=headers)

print(df)

从表格中提取数据后,您可以将其用于多种用途,例如数据分析、机器学习,或将其存储在数据库中。您还可以修改代码,从同一网页或多个网页中抓取多个表格。

请注意,并非所有网站都像这样容易抓取数据。许多网站都采用了高级防护措施来防止数据抓取,例如验证码(CAPTCHA)和IP地址封禁,但幸运的是,有一些第三方服务(如WebScrapingAPI 提供了 IP轮换和 验证码绕过功能 使您能够抓取这些目标网站。

希望本节内容能帮助您全面了解如何使用 Python 从 HTML 表格中抓取数据。在下一节中,我们将探讨一些优化此过程的方法以及网页抓取的最佳实践。

更进一步

虽然我们在上一节中构建的爬虫能够正常运行,并能从 HTML 表格中提取数据,但我们可以通过多种方式对其进行改进和优化,以提升其效率和效果。以下是一些建议:

  • 处理分页:如果要抓取的 HTML 表格分布在多个页面上,您需要修改抓取程序以处理分页,并从所有页面抓取数据。通常可以通过跟随链接或使用分页控件(例如“下一页”按钮)来导航至下一页数据。
  • 处理 AJAX:如果 HTML 表格是通过 AJAX 或 JavaScript 生成的,您可能需要使用 Selenium 等工具来执行 JavaScript 并加载数据到表格中。Selenium 是一个 Web 测试库,可以模拟用户与网页的交互,并允许您抓取动态生成的数据。一个不错的替代方案是使用我们的抓取工具,该工具可以在页面上渲染完 JavaScript 后返回数据。 您可查阅我们的文档以了解更多相关信息。
  • 错误处理:在爬虫程序中,优雅地处理错误和异常非常重要,因为网络或服务器问题可能会导致请求失败或数据不完整。您可以使用 try/except 代码块来捕获异常并进行适当处理,例如重试请求或记录错误。
  • 扩展爬虫:如果您需要从多个数据表或网站抓取大量数据,可能需要扩展爬虫以应对增加的工作负载。这可以通过并行处理或将任务分配到多台机器等技术来实现。

通过改进和优化您的网页爬虫,您可以更高效、更有效地提取数据,并确保爬虫具备可靠性和可扩展性。在下一节中,我们将探讨为何使用专业的爬虫服务可能比自行开发爬虫更为明智。

摘要

在本文中,我们介绍了网络爬取的基础知识,并向您展示了如何编写一个简单的 Python 爬虫程序来从 HTML 表格中提取数据。虽然编写自己的爬虫程序既实用又有助于学习,但在许多情况下,使用专业的爬虫服务可能是一个更好的选择,原因如下:

  • 专业爬虫通常更可靠、更高效,因为它们专为大规模网页抓取而设计和优化。
  • 专业爬虫通常具备一些自制爬虫所不具备的功能和特性,例如支持验证码识别、速率限制,以及处理 AJAX 和 JavaScript。
  • 使用专业的爬虫工具可以节省您的时间和资源,因为您无需自行开发和维护爬虫程序。
  • 专业的数据抓取工具通常提供多种定价方案,其性价比往往高于自行开发抓取工具,特别是当您需要抓取大量数据时。

虽然自行开发爬虫可能是一次很有价值的经历,但在许多情况下,使用专业的爬虫服务可能更为实用且经济实惠。归根结底,是自行开发爬虫还是使用专业服务,取决于您的具体需求和资源。

希望本文能为您提供关于网络爬虫以及使用 Python 构建简单 HTML 表格爬虫过程的有用概述。

关于作者
安德烈·奥吉奥兰,全栈开发工程师 @ WebScrapingAPI
安德烈-奥吉奥兰全栈开发工程师

安德烈·奥吉奥兰(Andrei Ogiolan)是 WebScrapingAPI 的全栈开发工程师,他在产品各领域均有贡献,并协助为该平台构建可靠的工具和功能。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网页数据。