Python 抓取并处理页面表格数据实例。

描述

最近工作中遇到一个问题,生产系统的职位中需要一个职能字段,这个字段分为三级,类似于三级关联的枚举,产品经理人还挺好,直接提供了所有职能的分类,还做成了表格,如下图:
Python 抓取并处理页面表格数据实例。_第1张图片
现在需要做的是把这个表格转化成 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要更方便。

你可能感兴趣的:(python,爬虫)