最近工作中遇到一个问题,生产系统的职位中需要一个职能字段,这个字段分为三级,类似于三级关联的枚举,产品经理人还挺好,直接提供了所有职能的分类,还做成了表格,如下图:
现在需要做的是把这个表格转化成 JS 对象,作为下拉框的数据。大致如下:
var level1 = [
{
id: '1',
value: '专业技术人员',
display: '专业技术人员',
}
];
var level2 = [
{
id: '2',
parentId: '1',
value: '专业分析',
display: '专业分析'
},
{
id: '3',
parentId: '1',
value: '软件开发',
display: '软件开发'
}
];
var level3 = [
{
id: '4',
parentId: '2',
value: '系统分析工程师',
display: '系统分析工程师'
},
{
id: '5',
parentId: '2',
value: '公共安全分析工程师',
display: '公共安全分析工程师'
}
];
level1对应一级下拉框,level2 对应二级下拉框,level3 就是三级下拉框的选项。
一开始尝试手写这个js对象,才写了没几个直接崩溃,录完2000多条不得把人累死,这时候想到了Python,因为这个表格刚好是一个页面,正好可以用python抓取页面数据。不是太难,还是很快就搞好了,最终代码如下:
from urllib.request import urlopen
from bs4 import BeautifulSoup
def find_table_array():
html = urlopen("file:///C:/Users/ThinkPad/Desktop/module_publish__category.md.html")
bs = BeautifulSoup(html.read(), 'html.parser')
trs = bs.findAll("tr")
tableArray = []
for tr in trs:
tdArray = []
tds = tr.findAll("td")
for td in tds:
tdArray.append(td.text)
tableArray.append(tdArray)
return tableArray
def resolve_array(table_array):
enumValue = 1
result = {}
level1_list = []
level2_list = []
dist2 = {}
level3_list = []
dist3 = {}
level1_result = []
level2_result = []
level3_result = []
l1_id_dist = {}
l2_id_dist = {}
for td in table_array:
if len(td) == 3:
level1_list.append(td[0])
level2_list.append(td[1])
level3_list.append(td[2])
dist2[td[1]] = td[0]
dist3[td[2]] = td[1]
level1 = list(set(level1_list))
level1.sort(key=lambda x: level1_list.index(x))
for l1 in level1:
l1.strip()
l1_id = str(enumValue)
l1_dist = {'id': l1_id, 'value': l1, 'display': l1}
enumValue = enumValue + 1
level1_result.append(l1_dist)
l1_id_dist[l1] = l1_id
result['level1'] = level1_result
level2 = list(set(level2_list))
level2.sort(key=lambda x: level2_list.index(x))
for l2 in level2:
l2.strip()
l2_id = str(enumValue)
l1_name = dist2.get(l2)
l1_id = l1_id_dist.get(l1_name)
l2_dist = {'id': l2_id, 'parentId': l1_id, 'value': l2, 'display': l2}
enumValue = enumValue + 1
level2_result.append(l2_dist)
l2_id_dist[l2] = l2_id
result['level2'] = level2_result
level3 = list(set(level3_list))
level3.sort(key=lambda x: level3_list.index(x))
for l3 in level3:
l3.strip()
l3_id = str(enumValue)
l2_name = dist3.get(l3)
l2_id = l2_id_dist.get(l2_name)
l3_dist = {'id': l3_id, 'parentId': l2_id, 'value': l3, 'display': l3}
enumValue = enumValue + 1
level3_result.append(l3_dist)
result['level3'] = level3_result
resultStr = str(result)
# 这里resultStr 就是一个JSON了,用JSON格式化工具处理一下就可以了
print(resultStr)
# 三级级联表格数据转换为json形式
if __name__ == '__main__':
tabArray = find_table_array()
resolve_array(tabArray)
将结果格式化后差不多1万多行,这要是一个一个的敲,基本是不可能的,python还是挺香的呀。
当然,其它语言也可以实现这个功能,但感觉python要更方便。