当前位置: 首页 > 后端技术 > Python

Python批量从文档中提取电话号码和邮箱地址

时间:2023-03-26 17:05:17 Python

当你想批量提取文档(如简历)中的电话号码和邮箱地址时,可以参考如下代码:提取结果保存在“resumes.xlsx”表中。importosfromwin32comimportclientaswcimportglobfromshutilimportcopyfileimportos.path,refrompdfminer.pdfinterpimportPDFResourceManager,PDFPageInterpreterfrompdfminer.converterimportPDFPageAggregatorfrompdfminer.layoutimportLAParamsfrompdfminer.pdfpageimportPDFTextExtractionNotAllowed,PDFPagefrompdfminer.pdfparserimportPDFParserfrompdfminer.pdfumentimportPDFParser从pdfminer.pdfdocument导入PDFParseropenpyxlimportWorkbook'''第一步:将doc和docx格式的简历转为pdf文件复制到pdfPath文件夹,将pdf格式的简历直接复制到pdfPath文件夹,'''word=wc.Dispatch('Word.Application')print('当前工作路径:'+os.getcwd())#处理路径FolderPath=os.getcwd()#脚本工作路径SaveFolderPath=FolderPath+'\\pdfPath'#PDF格式恢复保存路径os.mkdir(SaveFolderPath)#创建文件夹WordPath=FolderPath+'/*[doc,docx]'#过滤掉doc和docx格式的文件PdfPath=FolderPath+'/*[pdf]'#过滤掉pdf格式的文件tprint('\nResumeformatconversionprocessing...\n')#将当前目录下的doc和docx文件转换成pdf文件后,放入pdfPath文件夹files=glob.glob(WordPath)forfile_path_wordinfiles:#获取文件名name=os.path.basename(file_path_word)names=re.findall(r'(.*?).doc',name)[0]print(names+'.pdf')doc=word.Documents.Open(file_path_word)doc.SaveAs(SaveFolderPath+'\\%s.pdf'%names,17)doc.Close()#将当前目录下的pdf文件复制到pdfPath文件夹files=glob.glob(PdfPath)forfile_path_pdfinfiles:name=os.path.basename(file_path_pdf)names=re.findall(r'(.*?).pdf',name)[0]print(names+'.pdf')copyfile(file_path_pdf,SaveFolderPath+'\\%s.pdf'%names)word.Quit()'''第二步:解析pdf文件'''classCPdf2TxtManager():defchangePdfToText(self,filePath):getInfo={'Phone':None,'Email':None}#Openfileinbinaryreadmode=open(filePath,'rb')#Usefileobjecttocreateapdfdocumentparserpraser=PDFParser(file)#创建一个PDF文档对象,存储文档结构,提供密码初始化,不需要传这个参数doc=PDFDocument(praser,password='')#检查file允许文本提取如果不是doc.is_extractable:raisePDFTextExtractionNotAllowed#创建一个PDF资源管理器来管理共享资源,#caching=False不缓存rsrcmgr=PDFResourceManager(caching=False)#创建一个PDF设备对象laparams=LAParams()#创建一个PDF页面聚合对象device=PDFPageAggregator(rsrcmgr,laparams=laparams)#创建一个PDF解析器对象http://www.fx61.com/activitiesinterpreter=PDFPageInterpreter(rsrcmgr,device)#获取文档目录(outline),文档没有outline会报错#当PDF文档没有目录时,会报:raisePDFNoOutlinespdfminer.pdfdocument.PDFNoOutlines#print(doc.get_outlines())#Getpagelistprint(PDFPage.get_pages(doc))#循环遍历列表,每次处理一个页面的内容forpageinPDFPage.create_pages(doc):interpreter.process_page(page)#接受页面的LTPage对象layout=device.get_result()#这里layout存储在一个LTPage对象中这个page解析出来的各种对象#一般包括LTTextBox,LTFure,LTImage,LTTextBoxHorizo??ntal等forxinlayout:ifhasattr(x,'get_text'):fileNames=os.path.splitext(文件路径)结果=x。get_text()#print('###'+results)#匹配邮箱emailRegex=re.compile(r'''([a-zA-Z0-9._%+-]+#邮箱用户名@#@符号[a-zA-Z0-9.-]+#域名(.[a-zA-Z]{2,4})#域名后缀)''',re.VERBOSE)matchedEmail=emailRegex.search(results)ifmatchedEmail:#print(matchedEmail.group())getInfo['Email']=matchedEmail.group()#匹配电话号码phoneRegex=re.compile(r'''(([1])#手机号码通常以'1'开头(\d{2})#后跟两个数字(\s|-|.|'')?#可能有像'-''.'或空格(\d{4})这样的定界符#四个数字(\s|-|.|'')?#可能有像'-''.'或空格这样的定界符(\d{4})#四个数字(\s*(ext|x|ext.)\s*(\d{2,5}))?#extension)''',re.VERBOSE)matchedPhone=phoneRegex.search(results)ifmatchedPhone:#print(matchedPhone.group())phoneNumber=matchedPhone.group()phoneNumber=phoneNumber.replace('','')#删除空格phoneNumber=phoneNumber.replace('-','')#删除'-'phoneNumber=phoneNumber.replace('.','')#去掉'.'getInfo['Phone']=phoneNumberreturngetInfo'''第三步:将求职者信息保存到Excel文件'''print('\nResume信息提取...')dirs=os.listdir(SaveFolderPath)#搜索目录pdf2TxtManager=CPdf2TxtManager()wb=Workbook()#创建文件对象ws=wb.active#获取第一个A表#将数据写入到指定单元格ws['A1']='姓名'ws['B1']='电话'ws['C1']='Email'#提取求职者联系方式,在dirs中写入Excel文件对象i=2forfile:retInfo=pdf2TxtManager.changePdfToText(SaveFolderPath+'\\'+file)name=re.findall(r'(.*?).pdf',file)[0]print('\n