kvtree_search.py 4.0 KB

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