123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """
- @author: bidikeji
- @time: 2024/12/26 10:31
- """
- from BiddingKG.dl.interface.html_2_kvtree import Html2KVTree
- import re
- requirement_pattern = "(采购需求|需求分析|项目说明|(采购|合同|招标|询比?价|项目|服务|工程|标的|需求|建设)(的?(主要|简要|基本|具体|名称及))?" \
- "(内容|概况|概述|范围|信息|规模|简介|介绍|说明|摘要|情况)([及与和]((其它|\w{,2})[要需]求|发包范围|数量))?" \
- "|招标项目技术要求|服务要求|服务需求|项目目标|需求内容如下|建设规模)为?([::,]|$)"
- aptitude_pattern = "资质(资格)要求|资格(资质)要求|单位要求|资质及业绩要求|((资格|资质|准入)[的及]?(要求|条件|标准|限定|门槛)|竞买资格及要求|供应商报价须知)|按以下要求参与竞买|((报名|应征|竞买|投标|竞投|受让|报价|竞价|竞包|竞租|承租|申请|参与|参选|遴选)的?(人|方|单位|企业|客户|机构)?|供应商|受让方)((必?须|需|应[该当]?)(具备|满足|符合|提供)+以?下?)?的?(一般|基本|主要)?(条件|要求|资格(能力)?|资质)+|乙方应当符合下列要求|参与比选条件|合格的投标人|询价要求|项目要求"
- pinmu_name_pattern = "采购品目(名称)?([::,]|$)"
- addr_bidopen_pattern = "([开评]标|开启|评选|比选|磋商|遴选|寻源|采购|招标|竞价|议价|委托|询比?价|比价|谈判|邀标|邀请|洽谈|约谈|选取|抽取|抽选|递交\w{,4}文件)[))]?(时间[与及和、])?(地址|地点)([与及和、]时间)?([::,]|$)"
- addr_bidsend_pattern = "((\w{,4}文件)?(提交|递交)(\w{,4}文件)?|投标)(截止时间[与及和、])?地[点址]([与及和、]截止时间)?([::,]|$)"
- pattern_dic_single = {'requirement': requirement_pattern,
- 'aptitude': aptitude_pattern,
- 'pinmu_name': pinmu_name_pattern}
- pattern_dic_addr = {'addr_bidopen': addr_bidopen_pattern,
- 'addr_bidsend': addr_bidsend_pattern}
- def get_kvtree_value(html):
- '''
- 通过kv数解析,正则匹配 k 值获取内容
- :param html:
- :return:
- '''
- _pd = Html2KVTree(html)
- kv_single_dic = {} # 单独放在外面的字段
- kv_addr_dic = {} # 放在地址字典的字段
- for k, v in pattern_dic_single.items():
- kv_l = _pd.extract_kv(v)
- value = ''
- for d in kv_l:
- ser = re.search(v, d.get('key', ''))
- if ser and ser.end()/len(d.get('key', ''))<0.5: # 571545382 过滤错误提取,例 供应商要求澄清采购文件的截止时间 提取到 供应商要求 aptitude
- continue
- elif d.get('key', '').strip() == d.get('value', '').strip(): # 修复 571425136 k: aptitude, key: 1.供应商资质, value: 1.供应商资质
- continue
- if d.get('value', '').strip() != '':
- value = d['value'].strip()
- break
- if value != '' and re.search('[\u4e00-\u9fa5]{2,}', value): # 包含两个中文以上的才要
- kv_single_dic[k] = value
- for k, v in pattern_dic_addr.items():
- kv_l = _pd.extract_kv(v)
- value = ''
- for d in kv_l:
- if d.get('value', '').strip() != '':
- value = d['value'].strip()
- if re.search('时间:', value) and re.search('地[点址]:(?P<addr>[\w()()【】-]{5,50})[,。]', value):
- value = re.search('地[点址]:(?P<addr>[\w()()【】-]{5,50})[,。]', value).group('addr')
- break
- if value != '' and re.search('\w{2,5}[省市区]|\d号|\w{2,12}自治[区州县旗]|采购网|平台|公司', value): # 包含两个中文以上的才要 避免 571236792 文件获取地点:-- 这种也提取
- kv_addr_dic[k] = value
- return kv_single_dic, kv_addr_dic
- if __name__ == "__main__":
- with open('d:/html/2.html', encoding='utf-8') as f:
- html = f.read()
- rs = get_kvtree_value(html)
- print(rs)
|