Python解决xlrd读取HTML格式Excel报错及pd.read_html数据不完整问题
本文解决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'来切换解析器,从而解决问题。
以上为个人经验分享,希望能为大家提供参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













