人行征信第三张报告的信息提取

提取第三张报告的各种信息。使用正则和xpath方法。

# coding=utf8

import re,json,os
from lxml import etree
from collections import OrderedDict
from common import html,LoggerUntil,handle_parse_exception
from html_processor import  HtmlProcessor

logger = LoggerUntil(name="crcc_paser").getlog(logfilename=‘crcc_paser.log‘,loglevel=2,add_StreamHandler=1)
class SaveHtmlFileMixin(object):
    def save_to_file(self):
        f = open(self.create_file(),‘wb‘)
        f.write(self.html)

    def create_file(self):
        if not os.path.exists(‘htmldir‘):
            os.mkdir(‘htmldir‘)
        html_file_name = ‘htmldir‘ + ‘/‘ + self.name + ‘.html‘
        return  html_file_name

class CrccPaser(SaveHtmlFileMixin):
    def __init__(self,html,name):
        self.html = html
        self.name = name
        self.data = OrderedDict()
        self.data[‘name‘] = name
        self.selector = None
        self.text =  self._get_text()
        self.get_selector()

    def _get_text(self):
        text = self.html.decode(‘utf8‘)
        return text

    def get_selector(self):
        self.selector = etree.HTML(self.text)

    def extract_user_info(self):
        self.data[‘report_no‘] = re.search(u‘报告编号:(.*?)</strong>‘, self.text).group(1).strip()
        self.data[‘query_time‘] = re.search(u‘查询时间:(.*?)</strong>‘, self.text).group(1).strip()
        self.data[‘report_time‘] = re.search(u‘报告时间:(.*?)</strong>‘, self.text).group(1).strip()
        self.data[‘crcc_name‘] = re.search(u‘姓名:(.*?)</strong>‘, self.text).group(1).strip()
        self.data[‘id_type‘] = re.search(u‘证件类型:(.*?)</strong>‘, self.text).group(1).strip()
        self.data[‘id_no‘] = re.search(u‘证件号码:(.*?)</strong>‘, self.text).group(1).strip()

    def extract_summary_information(self):
        account_num = re.search(
            u‘<tr>\s*?<td align="left" class="p">\s*?&nbsp;账户数\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?</tr>‘,
            self.text).groups()
        self.data[‘account_num‘] = self._init_num_dict(account_num)

        uncleared_num = re.search(
                u‘<tr>\s*?<td align="left" class="p">\s*?&nbsp;&nbsp;&nbsp;未结清/未销户账户数\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?</tr>‘,
                self.text).groups()
        self.data[‘uncleared_num‘] = self._init_num_dict(uncleared_num)

        overdue_num = re.search(
                u‘<tr>\s*?<td align="left" class="p">\s*?&nbsp;发生过逾期的账户数\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?</tr>‘,
                self.text).groups()
        self.data[‘overdue_num‘] = self._init_num_dict(overdue_num)

        overdue90_num = re.search(
                u‘<tr>\s*?<td align="left" class="p">\s*?&nbsp;&nbsp;&nbsp;发生过90天以上逾期的账户数\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?</tr>‘,
                self.text).groups()
        self.data[‘overdue90_num‘] = self._init_num_dict(overdue90_num)

        assure_num = re.search(
                u‘<tr>\s*?<td align="left" class="p">\s*?&nbsp;为他人担保笔数\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?<td align="center" class="p">\s*(.*?)\s*?</td>\s*?</tr>‘,
                self.text).groups()
        self.data[‘assure_num‘] = self._init_num_dict(assure_num)

    @staticmethod
    def _init_num_dict(num_tuple):
        num_dict = {}
        num_dict[‘credit_card‘],num_dict[‘ home_loans‘],num_dict[‘other_loans‘] = num_tuple
        return  num_dict

    def extract_all_loan_information(self):
        all_loan_information = re.findall(u‘<li\s*?style="list-style-type: decimal; list-style-position: outside">\s*?(\S*?)\s*?</li>‘, self.text)
        self.data[‘all_loan_information‘] = all_loan_information

    def extract_public_records(self):
        if not  re.search(u‘系统中没有您最近5年内的欠税记录、民事判决记录、强制执行记录、行政处罚记录及电信欠费记录。‘,self.text):
            public_records=self.selector.xpath(‘//table[@align="center"]//table[5]/tbody/tr[3]/td‘)[0].strip()   # 还不能确定具体格式,有可能造成解析中断出错   #TODO
        else:
            public_records=[u‘系统中没有您最近5年内的欠税记录、民事判决记录、强制执行记录、行政处罚记录及电信欠费记录。‘]
        self.data[‘public_records‘] = public_records

    def extract_query_records(self):
        if  not  re.search(u‘系统中没有您的信用报告最近2年被查询的记录。‘,self.text):
            #query_records=selector.xpath(‘//table[@align="center"]//table[6]/tbody/tr[3]/td‘)[0].strip()
            query_records = re.findall(
                u‘<tr align="center">[\s\S]*?td class="p">\s*(.*?)\s*?</td>[\s\S]*?<td class="p">\s*(.*?日)\s*?</td>[\s\S]*?<td class="p">\s*(.*?)\s*?</td>[\s\S]*?<td class="p">\s*(.*?)\s*?</td>[\s\S]*?</tr>‘,
                self.text)
            query_records = self._init_query_records(query_records)
        else:
            query_records =[u‘系统中没有您的信用报告最近2年被查询的记录。‘]

        self.data[‘query_records‘] = query_records

    @staticmethod
    def _init_query_records(query_records):
        """
        :type query_records : list
        """
        query_records_list = []
        for record_tuple in query_records:
            query_record_dict = OrderedDict()
            query_record_dict[‘no‘], query_record_dict[‘query_date‘], query_record_dict[‘query_person‘],query_record_dict[‘query_reason‘]  = record_tuple
            query_records_list.append(query_record_dict)
        return query_records_list

    @handle_parse_exception
    def extract_all(self):
        self.extract_user_info()
        self.extract_summary_information()
        self.extract_all_loan_information()
        self.extract_public_records()
        self.extract_query_records()

def extract_crcc(html_str,name):

    htmlProcessor = HtmlProcessor(html_str,name)
    htmlProcessor.save_to_file()   # 保存html文件

    crccPaser = CrccPaser(html_str, name)
    # crccPaser.save_to_file()
    crccPaser.extract_all()
    logger.info(json.dumps(crccPaser.data, ensure_ascii=False)) # TODO
    return json.dumps(crccPaser.data, ensure_ascii=False)

if __name__ == ‘__main__‘:
    extract_crcc(html,‘小明5‘)

其中html第三张报告的页面源码字符串。

结果是

{"name": "小明5", "report_no": "2017122200004891965680", "query_time": "2017.12.22 11:12:32", "report_time": "2017.12.22 18:38:18", "crcc_name": "小明5", "id_type": "身份证", "id_no": "**************4337", "account_num": {" home_loans": "0", "other_loans": "2", "credit_card": "0"}, "uncleared_num": {" home_loans": "0", "other_loans": "0", "credit_card": "0"}, "overdue_num": {" home_loans": "0", "other_loans": "0", "credit_card": "0"}, "overdue90_num": {" home_loans": "0", "other_loans": "0", "credit_card": "0"}, "assure_num": {" home_loans": "0", "other_loans": "0", "credit_card": "0"}, "all_loan_information": ["2010年8月23日国家开发银行湖北省分行发放的6,000元(人民币)个人助学贷款,2014年10月已结清。", "2009年11月19日国家开发银行湖北省分行发放的6,000元(人民币)个人助学贷款,2014年10月已结清。"], "public_records": ["系统中没有您最近5年内的欠税记录、民事判决记录、强制执行记录、行政处罚记录及电信欠费记录。"], "query_records": [{"no": "1", "query_date": "2017年12月4日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}, {"no": "2", "query_date": "2017年11月20日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}, {"no": "3", "query_date": "2017年11月6日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}, {"no": "4", "query_date": "2017年10月20日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}, {"no": "5", "query_date": "2017年10月10日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}, {"no": "6", "query_date": "2017年9月27日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}, {"no": "7", "query_date": "2017年9月18日", "query_person": "本人", "query_reason": "本人查询(互联网个人信用信息服务平台)"}]}

原文地址:https://www.cnblogs.com/ydf0509/p/8143857.html

时间: 2024-10-30 15:57:21

人行征信第三张报告的信息提取的相关文章

2017白条套现秒到方法(规避上征信)京东白条自己能套现

2017白条套现秒到方法(规避上征信)京东白条自己能套现 近日,京东金融在官方微博上证实,包括金条.白条.京农贷业务均已启动征信接入工作,也就是说,若开通上述业务,那么均会上报至你在人行的信用报告中. 对此,我们主要关注的是以下几点: 1.白条每月更新一次信报 比苏宁"任性付"好一点的是,京东白条不会将每一笔消费都体现在信报上,而是每月按账单更新负债情况(更正:苏宁已于 2017 年 8 月起,对客户的多笔贷款记录予以合并上报人行征信系统,不再逐笔展示客户贷款信息.).然而,京东金融官

央行启动我国征信自律组织研究课题

由 央行上海总部与上海市信用研究会联合主办,上海信而富承办的“我国征信自律组织建设课题研讨暨互联网金融发展给征信业带来的机遇和挑战”专题研讨会近日举 行.上海市信用研究会副会长兼秘书长.上海交通大学教授刘海龙主持了研讨会.来自政府.高校.金融机构.征信机构.互联网金融企业的40多位专家学者参与 了研讨. 记者从会上了解到,央行征信管理局已于今年年初在北京和上海同时启动了<我国征信自律组织研究>课题,其中,上海方面是由上海市信用研究会承担此项课题.此次研讨会旨在听取征信业内专家建议,进一步完善课

【新年第一篇金融科技】征信报告揭秘50问之第一篇

<征信报告揭秘50问> 前言:大家对征信这个词肯定不会陌生,但大家对这个词的由来可能就不是了解的很清晰.其实这两个字已经有2000多年的历史,中国古代最早关于征信的说法出自<左传>"君子之言,信而有征",由此可见古人对信用是非常看重的.信用报告也被喻为"经济×××",所以说有信用走遍天下,无信用寸步难行.道理我们讲通了,那真拿到报告时是否看的懂.怎么养信用.什么才叫好.自己是否属于优质,我相信可能大部分的朋友都不是很精通.心里会有很多的疑问,

征信数据模型

征信行业的数据建模,最好还是传统风控转过来做所谓的大数据模型.说的更明白些,做这种信贷类模型,业务经验也是少不了的. 所以当自己是个菜鸟,或者没有思路构造原始特征的话,去业务那转两圈. 业务,或者风控.征信.信审部门讨厌的人群,大多是有些问题的,例如 信用白户.没有信用历史记录的 替人担保的.担保人是要负连带责任的,如果贷款人不能按约还款,担保人就需要代替偿,如果以房产作为抵押进行担保,那么贷款人债务还不上,担保人的房产就面临拍卖风险 信用卡过多.正常在2-5张 频繁申请提额.信用卡每一次提额都

大数据征信 是伪命题?还是金融行业的救世主?

http://www.weiyangx.com/207257.html 2016年,互金圈遭遇冰火两重天:一边是P2P的倒闭潮,一边是,新模式的全面崛起. 进入涅槃期的P2P,为新崛起的互金圈,上了最为昂贵的一课:风控之痛,恐怕是扼住互金咽喉的那只手. 没有征信体系的中国,互金的发展,就如沙漠中迷途的旅人,饥渴难耐,却又茫然无措. 政府也意识到这个问题, 在万众期待中,八家征信机构拿着央行的“介绍信”,开始蹒跚学步. 不管是阿里的“芝麻信用”,还是腾讯的社交数据,这些所谓的“大数据征信”,真的能

互联网征信中的信用评分模型(转)

摘要:面向小微商户以及个人消费的小微信贷是当前互联网金融的重要发展方向,并且正在经历爆发式增长.在这个增长过程中,如何在没有实物抵押的情况下,通过互联网大数据分析实现快速准确征信是一个非常重要的问题.为此,不同的数据来源将各显神通地为信用评估提供依据.本文将通过一个真实的案例出发,进行分析和探讨,针对用户历史行为数据建立信用评分模型,并通过该模型改进信用评估的预测效果. 关键词: 小微信贷:互联网征信:信用评分:Logistic回归模型 一.业务介绍 行业介绍 小微信贷,我们定义为金额较小,并且

个人征信已开放,互联网巨头如何行动

文 苏曼丽 “做小微金融,并不是我们想做金融,不是想赚钱,而是想做信用体系.”阿里巴巴董事局主席马云的这番话基本现实. 1月5日央行发文,要求腾讯征信.芝麻信用等八家机构做好个人征信业务的准备工作,准备时间为6个月. 这次,个人征信市场真的向阿里“芝麻开门”了.互联网企业的征信跟央行的有何不同?“二马”还会给我们带来什么惊喜? 一.跟央行征信有何不同? 1. 央行的信用信息基本是来自于金融机构,笔者曾经打印过自己的信用报告,主要内容是个人身份信息.银行信贷记录.逾期记录,内容较为单一. 2. 但

基于大数据技术的手机用户画像与征信研究

内容提要:手机用户画像是电信运营商实现“数据驱动业务与运营”的重要举措.首先,介绍了手机用户画像过程中对个人隐私保护的方法,然后分析手机用户画像的数据来源与大数据实现技术,最后,通过数据样本实例分析手机用户画像在个人征信中的应用. 引言 随着计算机网络技术的不断发展,“数据即资源”的大数据时代已经来临.用户画像是电信运营商为了避免管道化风险,实现“数据驱动业务与运营”的重要举措.用户画像与应用大数据技术对客户分类密切相关,是单个客户的众多属性标签的累积:另一方面,在运营商涉足的消费金融领域,对手

方兴未艾的征信业需要创新提供成长养料

"创新是民族进步的灵魂,是一个国家兴旺发达的不竭动力:也是一个企业生存的第一要素,是一个企业具有竞争力的体现."21315陈泽华专著<第三次机会>中写道. "不创新,就死亡."管理大师彼得·德鲁克的忠告已经成为新经济时代企业生存发展的真实写照.陈泽华表示全世界都在讲创新,实施创新工程.一个企业的发展史,必然同时也是一部创新史.世界企业发展的历史充分表明,只有创新才是企业生命力的无穷源泉. 对于这点,我国质量信用体系与理论的最早提出学者之一--21315征