看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas.read_html()
是 Pandas 库中用于从 HTML 文档中提取表格数据并将其转换为 DataFrame
对象的函数。该函数利用解析 HTML 内容的能力,帮助用户快速获取网页或本地 HTML 文件中的表格数据,便于后续的数据分析与处理。
pandas.read_html(
io,
*,
match='.+',
flavor=None,
header=None,
index_col=None,
skiprows=None,
attrs=None,
parse_dates=False,
thousands=', ',
encoding=None,
decimal='.',
converters=None,
na_values=None,
keep_default_na=True,
displayed_only=True,
extract_links=None,
dtype_backend=<no_default>,
storage_options=None
)
由于 pandas.read_html
函数具有多个参数,以下将逐一详细解释每个参数的用途和意义:
io
str
、pathlib.Path
、file-like object
、URL
等。match
str
或 re.Pattern
'.+'
(匹配所有内容)flavor
{'bs4', 'lxml', 'html5lib', None}
None
(自动选择)'bs4'
: 使用 BeautifulSoup 解析器。'lxml'
: 使用 lxml 解析器。'html5lib'
: 使用 html5lib 解析器。None
: 自动选择可用的解析器。header
int
、list of int
、None
None
None
,则自动推断表头。可以指定具体的行号或多个行号以组合列名。index_col
int
、str
、sequence of int / str
、False
、None
None
None
,则使用默认的整数索引。可以指定单个列或多个列作为索引。skiprows
list-like
、int
、callable
、None
None
attrs
dict
、None
None
{'class': 'data'}
来选择具有特定类名的表格。parse_dates
bool
、list
、dict
、False
False
True
(解析所有可能的日期列)、指定具体的列名列表或使用字典进行详细配置。thousands
str
或 None
', '
','
可以正确解析像 1,000
这样的数字。encoding
str
、None
None
'utf-8'
、'gbk'
等。如果为 None
,则使用默认的编码。decimal
str
'.'
','
作为小数点。converters
dict
、None
None
na_values
scalar
、str
、list-like
、dict
、None
None
NaN
)。例如,可以将 'N/A'
或 'NULL'
视为缺失值。keep_default_na
bool
True
False
,则仅使用 na_values
指定的值作为缺失值。displayed_only
bool
True
False
,则解析所有表格,包括隐藏的表格。extract_links
bool
、str
或 callable
、None
None
True
(提取所有链接)、False
(不提取链接)或使用自定义函数进行链接提取。dtype_backend
str
或 _NoDefault
_NoDefault.no_default
storage_options
dict
、None
None
list
(包含多个 DataFrame
对象)DataFrame
对象的列表。如果在 HTML 文档中找到多个表格,每个表格将作为列表中的一个 DataFrame
返回。pandas.read_html()
主要用于从网页或本地 HTML 文件中提取表格数据。常见的使用场景包括:
假设我们要从维基百科页面提取表格数据,例如 List of countries by GDP。
import pandas as pd
# 从维基百科页面提取所有表格
url = 'https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)'
tables = pd.read_html(url, match='Country')
# 假设第一个表格是我们需要的
df = tables[0]
print(df.head())
输出
Country/Territory IMF[3] ... Per capita[4] Source
0 United States 21433226 ... 64543 USD IMF
1 China 14342903 ... 10410 USD IMF
2 Japan 5081770 ... 40246 USD IMF
3 Germany 3845630 ... 46454 USD IMF
4 India 2875142 ... 2170 USD IMF
假设我们有一个本地 HTML 文件 data.html
,内容如下:
<!DOCTYPE html>
<html>
<head>
<title>示例表格</title>
</head>
<body>
<table>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>城市</th>
</tr>
<tr>
<td>艾丽丝</td>
<td>30</td>
<td>纽约</td>
</tr>
<tr>
<td>鲍勃</td>
<td>25</td>
<td>洛杉矶</td>
</tr>
<tr>
<td>查理</td>
<td>35</td>
<td>芝加哥</td>
</tr>
</table>
</body>
</html>
使用 pandas.read_html()
读取该文件:
import pandas as pd
# 读取本地 HTML 文件中的所有表格
tables = pd.read_html('data.html')
# 假设第一个表格是我们需要的
df = tables[0]
print(df)
输出
姓名 年龄 城市
0 艾丽丝 30 纽约
1 鲍勃 25 洛杉矶
2 查理 35 芝加哥
假设一个 HTML 文件 multiple_tables.html
包含多个表格,我们只想提取包含特定关键词的表格。
<!DOCTYPE html>
<html>
<head>
<title>多个表格示例</title>
</head>
<body>
<h2>表格一:学生信息</h2>
<table>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>成绩</th>
</tr>
<tr>
<td>小明</td>
<td>20</td>
<td>85</td>
</tr>
<tr>
<td>小红</td>
<td>22</td>
<td>90</td>
</tr>
</table>
<h2>表格二:教师信息</h2>
<table>
<tr>
<th>姓名</th>
<th>科目</th>
<th>经验</th>
</tr>
<tr>
<td>张老师</td>
<td>数学</td>
<td>10年</td>
</tr>
<tr>
<td>李老师</td>
<td>英语</td>
<td>8年</td>
</tr>
</table>
</body>
</html>
我们希望只提取包含“学生信息”的表格:
import pandas as pd
# 读取本地 HTML 文件中匹配 '学生信息' 的表格
tables = pd.read_html('multiple_tables.html', match='学生信息')
# 提取第一个匹配的表格
df = tables[0]
print(df)
输出
姓名 年龄 成绩
0 小明 20 85
1 小红 22 90
假设我们有一个 HTML 表格,但没有明确的表头,我们可以通过 header
和 index_col
参数指定:
<!DOCTYPE html>
<html>
<head>
<title>无表头表格示例</title>
</head>
<body>
<table>
<tr>
<td>艾丽丝</td>
<td>30</td>
<td>纽约</td>
</tr>
<tr>
<td>鲍勃</td>
<td>25</td>
<td>洛杉矶</td>
</tr>
<tr>
<td>查理</td>
<td>35</td>
<td>芝加哥</td>
</tr>
</table>
</body>
</html>
使用 header
和 index_col
参数读取:
import pandas as pd
# 读取无表头的 HTML 表格,指定列名和索引列
df = pd.read_html(
'no_header_table.html',
header=None,
names=['姓名', '年龄', '城市'],
index_col='姓名'
)[0]
print(df)
输出
年龄 城市
姓名
艾丽丝 30 纽约
鲍勃 25 洛杉矶
查理 35 芝加哥
假设我们有一个包含链接的 HTML 表格,我们希望提取这些链接:
<!DOCTYPE html>
<html>
<head>
<title>包含链接的表格</title>
</head>
<body>
<table>
<tr>
<th>姓名</th>
<th>个人主页</th>
</tr>
<tr>
<td>艾丽丝</td>
<td><a href="https://example.com/alice">Alice's Page</a></td>
</tr>
<tr>
<td>鲍勃</td>
<td><a href="https://example.com/bob">Bob's Page</a></td>
</tr>
</table>
</body>
</html>
使用 extract_links
参数提取链接:
import pandas as pd
# 读取包含链接的 HTML 表格,并提取链接
df = pd.read_html(
'links_table.html',
extract_links=True
)[0]
print(df)
输出
姓名 个人主页
0 艾丽丝 ('Alice\'s Page', 'https://example.com/alice')
1 鲍勃 ('Bob\'s Page', 'https://example.com/bob')
对于非常大的 HTML 表格,可以使用 chunksize
参数逐块读取,以节省内存:
import pandas as pd
# 假设 'large_table.html' 包含一个非常大的表格
chunk_iter = pd.read_html(
'large_table.html',
chunksize=1000
)
for chunk in chunk_iter:
print(chunk.head())
# 在这里可以对每个块进行处理
输出
列1 列2 列3
0 ... ... ...
1 ... ... ...
...
pandas.read_html()
是一个功能强大的工具,用于从 HTML 文档中提取表格数据并将其转换为 Pandas 的 DataFrame
对象。通过灵活设置参数,如 match
、flavor
、header
、attrs
等,可以高效地提取和处理各种复杂的表格数据。在数据分析、网络爬虫和数据集成等多个领域,掌握 read_html
的使用方法能够显著提升数据获取和预处理的效率。
更新时间:2024-10-10 09:01:07 标签:pandas python html