Python解决xlrd读取HTML格式Excel报错及pd.read_html数据不完整问题

Aria
Aria
发布时间:2026-10-15 | 4人浏览过
原创

本文解决Python中使用xlrd读取HTML格式Excel文件时出现的Unsupported format报错,并针对pd.read_html读取数据不完整的问题,推荐将解析器flavor设置为'bs4'以获取完整数据。

Python读取HTML表格

数据部门提供的数据文件虽然扩展名为xls,但在执行读取脚本时却遭遇报错。

具体报错信息如下:

xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'<html xm'

导致该错误的原始读取脚本如下:

data_lines = read_excel_file(self.file_path)

def read_excel_file(file_path):
    """
    读取excel文件
    """
    import xlrd
    print('[Info] excel file: {}'.format(file_path))
    book = xlrd.open_workbook(file_path)
    sheet = book.sheet_by_index(0)
    data_lines = []
    for row in range(0, sheet.nrows):
        line_data = []
        for column in range(0, sheet.ncols):
            val = sheet.cell(row, column).value
            line_data.append(val)
        data_lines.append(line_data)
    return data_lines  # 二维数组

经排查,根本原因在于该文件实际格式为HTML表格,而非真正的Excel二进制格式。参考关于python xlrd unsupported format, or corrupt file的相关讨论可知,xlrd无法解析此类文件。

为解决此问题,改用pandas库的read_html函数读取文件。同时,在读取过程中需将NaN值替换为空字符,以确保数据格式的一致性。

def read_html_table(file_path):
    """
    读取html表格
    """
    import pandas as pd
    pd_table = pd.read_html(file_path)
    df = pd_table[0]
    # num_col = df.shape[1]
    # num_row = df.shape[0]
    df_data = df.values.tolist()
    df_data = df_data[1:]
    for r_idx, row in enumerate(df_data):
        for c_idx, value in enumerate(row):
            # 判断nan,参考https://stackoverflow.com/questions/944700/how-can-i-check-for-nan-values
            if value != value:
                df_data[r_idx][c_idx] = ""
    return df_data

通过上述调整,读取问题得以解决。

pd.read_html读取数据不完整问题

问题描述:当尝试从较大的HTML表格中直接提取数据时,发现pd.read_html返回的数据并不完整。经检查,源HTML中的table结构本身并无异常。

解决办法

pd.read_html默认使用的解析器为'lxml'。若遇到数据提取不完整的情况,可通过添加参数flavor='bs4'来切换解析器,从而解决问题。

以上为个人经验分享,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表