最近接到一批及其不规范的xls文件,本质是html格式,只是修改后缀为xls而已,因为有大量数字字符串,导致大量数据用Excel打开时,读取的数据失真,不得已自己写了个读取程序。全部读取后,默认为文本字符串,转换为标准Excel文件。
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 17 22:16:03 2019
@author: user
"""
import bs4
#import requests
from pandas.core.frame import DataFrame
def read_file(path):
with open(path, 'r+', encoding='UTF-8') as f:
str = f.read()
return str.strip().replace('\ufeff', '')
bgne_lb=[]#设置一个列表用于接收数据
html=r'C:\Users\user\Desktop\测试.htm'#假设这个就是文件在本地的地址
wb=read_file(html)
soup=bs4.BeautifulSoup(wb,'lxml')#解析html
#elems=soup.findAll("table",{"class":"wikitable"})[0]#当需要进一步精确匹配时才使用
table_ys=soup.findAll("table")[0]#读取第一个表格,Excel文件转成的html,用这个就可以了。
#elems=soup.select('table')#读取表格标签
#开始循环拆解
table_trs=table_ys.findAll("tr")#获得表格中行的集合
bghs=len(table_trs)
for i in range(bghs):
table_h=table_trs[i]
z_lie=table_h.findAll(['td', 'th'])#获得一行中列的集合
bgls=len(z_lie)
# print("%s%s%s%s" % ("i:",i,"bgls:",bgls))
bgnr_lb_h=[]
for ii in range(bgls):
z_lie_value=z_lie[ii].getText()
bgnr_lb_h.append(z_lie_value)#将单独一行中的数据写成一个列表
bgne_lb.append(bgnr_lb_h)#将整行数据作为一个元素添加到bgne_lb列表中
data=DataFrame(bgne_lb)#将获取的二维列表转为表格样式
data.to_excel("sample.xlsx", index=False,header = None)#输出为表,不带列号,输出文件名为sample.xlsx
print(data)