在做数据采集时,网页中的表格是非常典型的结构化内容。如果手动用requests加BeautifulSoup去解析,要处理行列合并、表头识别等细节,工作量不小。Pandas库的read_html()函数封装了表格解析能力,只要把网页地址丢给它,就能把页面里所有的table数据一次性读成DataFrame列表。

read_html()基本用法
read_html()的第一个位置参数可以是一个URL字符串、本地HTML文件或者HTML文本。函数内部会使用lxml或html5lib等解析器找到所有<table>标签,并尝试将其转化为DataFrame。返回结果是一个列表,列表中的每个元素对应页面里的一个表格。
直接传入URL示例
下面这段代码演示如何直接把URL传给read_html,并取出第一个表格:
import pandas as pd
# 直接传入网页URL,函数会自动请求页面并解析所有table
url = 'https://ipipp.com/sample_page.html'
tables = pd.read_html(url)
print('页面中表格数量:', len(tables))
# 取出第一个表格
df = tables[0]
print(df.head())
常用参数说明
虽然默认配置已经能处理很多情况,但了解几个常用参数可以提升提取准确率。
- header:指定哪一行作为列名,比如header=0表示第一行做表头。
- index_col:指定某一列作为行索引。
- flavor:选择解析引擎,可选'lxml'或'html5lib'。
- attrs:通过字典匹配table的属性,例如attrs={'class': 'data-table'}只提取特定样式的表格。
按属性筛选表格
当页面表格很多,但只需要其中一类时,可以用attrs参数:
import pandas as pd
url = 'https://ipipp.com/report.html'
# 只提取class为list的table
tables = pd.read_html(url, attrs={'class': 'list'})
df = tables[0]
print(df.shape)
注意事项
使用read_html()时要注意,它依赖第三方解析库,如果没安装会报错,可用pip install lxml html5lib补齐。另外,如果表格是通过JavaScript动态渲染的,直接传URL拿不到数据,因为read_html不会执行JS,这种场景要配合Selenium先渲染再传html字符串。
小结:对于静态网页中的表格,pandas.read_html()是最省事的爬取方案,几行代码就能把table变成可分析的DataFrame。
保存提取结果
提取后通常要落盘,比如存成CSV:
import pandas as pd
url = 'https://ipipp.com/static_table.html'
df = pd.read_html(url)[0]
# 保存为csv文件
df.to_csv('table_data.csv', index=False, encoding='utf-8-sig')
以上方式覆盖了从URL读取、参数控制到结果保存的完整流程,日常爬虫提取表格完全可以先用这个方法试一试。