如何用pd.read_html读取含重复表头与单列行的HTML表格?
解决Unicode表情表格读取的表头与行过滤问题
我来帮你搞定这个Unicode表情表格的读取问题!这个表格的结构确实有点棘手——合并单元格的表头、隔段重复的表头行,还有零散的单列行,咱们一步步来解决:
步骤1:完整读取表格,避免自动表头识别偏差
首先别着急用skiprows,因为pd.read_html对合并单元格的表头识别经常出问题,我们先把整个表格完整读进来:
import pandas as pd # 读取网页中的所有表格,这里取第一个表格 dfs = pd.read_html('http://unicode.org/emoji/charts/full-emoji-list.html', encoding='utf-8') df = dfs[0]
步骤2:手动设置正确的表头
观察原表格结构,真实的有效表头其实是第3行(Python索引为2的行),前两行是页面标题类的内容。我们把这一行设为列名,然后从第4行开始加载数据:
# 将第3行(索引2)设为列名 df.columns = df.iloc[2] # 截取从第4行(索引3)开始的有效数据,并重置索引 df = df.iloc[3:].reset_index(drop=True)
步骤3:过滤重复的表头行
表格中每隔若干行就会重复出现表头行,这些行的所有内容和我们设置的列名完全一致,我们可以通过这个特征过滤掉它们:
# 筛选出所有内容不等于表头的行(~表示取反) df = df[~df.eq(df.columns).all(axis=1)]
步骤4:过滤仅含单列的无效行
表格里存在一些只有单列内容的分隔/注释行,我们可以通过保留非空值足够多的行来过滤它们(这里设置阈值为5,可根据实际列数调整):
# 保留至少有5个非空值的行,并重置索引 df = df.dropna(thresh=5).reset_index(drop=True)
完整代码示例
把以上步骤整合起来,还可以给列名设置更清晰的别名(可选):
import pandas as pd # 读取表格 dfs = pd.read_html('http://unicode.org/emoji/charts/full-emoji-list.html', encoding='utf-8') df = dfs[0] # 设置正确表头并截取数据 df.columns = df.iloc[2] df = df.iloc[3:].reset_index(drop=True) # 过滤重复表头行 df = df[~df.eq(df.columns).all(axis=1)] # 过滤无效单行 df = df.dropna(thresh=5).reset_index(drop=True) # 可选:给列名设置更直观的别名 df.columns = [ 'Code', 'Sample_Emoji', 'Emoji_Name', 'Unicode_1', 'Unicode_2', 'Unicode_3', 'Unicode_4', 'Category', 'Subcategory', 'Added_Version' ] # 查看处理后的结果 print(df.head())
这样处理后,你就能得到结构清晰、没有重复表头和无效行的表情数据啦!
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

