pandas 可以解析 HTML 表格(如网页中的
<table>)和 XML/HTML 标记语言,非常适合网络数据采集场景。
1. read_html()
从一个 HTML 字符串、URL 或本地文件中提取所有
<table>标签,返回 DataFrame 的列表(页面上可能有多个表)。
1.1 常与参数
pd.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
)| 参数 | 说明 |
|---|---|
io | HTML 字符串、路径或 URL |
match | 正则表达式,匹配表格中包含该文本的行才返回该表 |
flavor | 解析引擎:'bs4' 或 'lxml' |
header | 表头行号 |
index_col | 索引列 |
skiprows | 跳过行 |
attrs | HTML 属性过滤(如 {"class": "data"}) |
parse_dates | 是否解析日期 |
thousands | 千位分隔符 |
encoding | 编码 |
converters | 列转换函数 |
na_values | 缺失值标识 |
displayed_only | 是否只显示可见的行/列(默认 True) |
1.2 使用示例
# 读取 URL 中的第一个表格
dfs = pd.read_html('https://example.com/data.html')
df = dfs[0]
# 匹配包含 '人口' 的表格
dfs = pd.read_html('page.html', match='人口')
# 指定属性过滤
dfs = pd.read_html('page.html', attrs={'class': 'stats'})
# 指定跳过行与列
dfs = pd.read_html('page.html', skiprows=2, index_col=0)依赖提示
read_html()要求安装lxml或BeautifulSoup4(bs4)。未安装时会报错并提示缺少依赖。
2. to_html()
将 DataFrame 输出为 HTML
<table>字符串,可直接保存为.html文件用于报告或网页展示。
2.1 常用参数
DataFrame.to_html(
buf=None, columns=None, col_space=None, header=True, index=True,
na_rep='NaN', formatters=None, float_format=None, sparsify=None,
index_names=True, justify=None, max_rows=None, max_cols=None,
show_dimensions=False, decimal='.', bold_rows=True, classes=None,
escape=True, notebook=False, border=1, table_id=None,
render_links=False
)| 参数 | 说明 |
|---|---|
buf | 输出文件路径或文件对象,None 返回字符串 |
columns | 指定输出列 |
col_space | 列宽 |
header | 是否输出表头 |
index | 是否输出索引 |
na_rep | 缺失值显示内容 |
formatters | 列格式化函数 |
float_format | 浮点格式 |
index_names | 是否显示索引名称 |
justify | 对齐方式 |
max_rows / max_cols | 最大行列数 |
bold_rows | 索引是否加粗 |
classes | CSS 类名(字符串或列表) |
escape | 是否转义 HTML 特殊字符 |
border | 表格边框宽度 |
table_id | HTML id 属性 |
render_links | 是否将 URL 渲染为链接 |
2.2 使用示例
# 输出为 HTML 字符串
html = df.to_html(index=False)
# 保存为文件
df.to_html('report.html', classes='table table-striped', index=False)
# 自定义格式
df.to_html(
'report.html',
float_format='%.2f',
na_rep='-',
justify='center'
)3. read_xml()
从 XML 文件或字符串中解析数据,支持扁平化路径匹配,返回 DataFrame。
3.1 函数签名
pd.read_xml(
path_or_buffer, xpath='.//*', namespaces=None, elems_only=False,
attrs_only=False, names=None, encoding=None, parse_dates=False,
parser='lxml', stylesheet=None, compression='infer',
storage_options=None, dtype=None
)3.2 参数详解
| 参数 | 说明 |
|---|---|
path_or_buffer | XML 文件路径、URL、文件对象或 XML 字符串 |
xpath | XPath 表达式,选择要解析的元素节点 |
namespaces | XML 命名空间映射字典(如 {'ns': 'http://...'}) |
elems_only | 仅解析元素文本(不包含属性) |
attrs_only | 仅解析元素属性 |
names | 列名列表 |
encoding | 编码 |
parse_dates | 是否解析日期 |
parser | 解析引擎:'lxml' 或 'etree' |
stylesheet | XSLT 样式表路径(用于转换 XML) |
compression | 压缩格式 |
storage_options | 云存储 |
dtype | 列类型映射 |
3.3 使用示例
import pandas as pd
xml_str = """
<data>
<record>
<name>张三</name>
<age>25</age>
</record>
<record>
<name>李四</name>
<age>30</age>
</record>
</data>
"""
df = pd.read_xml(xml_str, xpath='.//record')
# name age
# 0 张三 25
# 1 李四 30# 带命名空间的 XML
df = pd.read_xml(
'data.xml',
xpath='//ns:record',
namespaces={'ns': 'http://example.com/schema'}
)
# 只读取属性
df = pd.read_xml('data.xml', xpath='//book', attrs_only=True)4. to_xml()
将 DataFrame 输出为 XML 文档。
4.1 函数签名
DataFrame.to_xml(
path_or_buffer=None, index=True, root_name='data',
row_name='row', na_rep=None, attr_cols=None, elem_cols=None,
namespaces=None, prefix=None, encoding='utf-8',
xml_declaration=True, pretty_print=True, parser='lxml',
stylesheet=None, compression='infer', storage_options=None
)4.2 参数详解
| 参数 | 说明 |
|---|---|
index | 是否包含索引 |
root_name | 根节点名称(默认 'data') |
row_name | 行节点名称(默认 'row') |
na_rep | 缺失值表示 |
attr_cols | 作为属性的列 |
elem_cols | 作为元素的列 |
namespaces | 命名空间 |
prefix | 命名空间前缀 |
encoding | 编码 |
xml_declaration | 是否包含 XML 声明 |
pretty_print | 是否美化缩进 |
parser | 解析引擎 |
stylesheet | XSLT 样式表 |
4.3 使用示例
# 基本输出
xml_str = df.to_xml()
# <data>
# <row>
# <index>0</index>
# <name>张三</name>
# <age>25</age>
# </row>
# </data>
# 自定义根节点与行节点
df.to_xml('output.xml', root_name='users', row_name='user')
# 指定某些列作为属性
df.to_xml('output.xml', attr_cols=['id'])依赖提示
read_xml()/to_xml()默认使用lxml作为解析器,请确保已安装:pip install lxml。
文档 5:4.4 Excel.md