乐趣区

Python批量提取文档中的电话号码和邮箱

当你想批量提取文档 (如简历) 中的电话和邮箱,可以参考以下代码:

提取结果保存在“resumes.xlsx”表格中。

import os

from win32com import client as wc

import glob

from shutil import copyfile

import os.path,re

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

from pdfminer.converter import PDFPageAggregator

from pdfminer.layout import LAParams

from pdfminer.pdfpage import PDFTextExtractionNotAllowed,PDFPage

from pdfminer.pdfparser import PDFParser

from pdfminer.pdfdocument import PDFDocument

from openpyxl import Workbook

”’

step 1:

将 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 格式的文件

print(‘\n 简历格式转换处理中 …\n’)

# 将当前目录下的 doc,docx 文件转换成 pdf 文件后,放到 pdfPath 文件夹

files = glob.glob(WordPath)

for file_path_word in files:

# 获取文件名

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)

for file_path_pdf in files:

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()

”’

step 2:

解析 pdf 文件

”’

class CPdf2TxtManager():

def changePdfToText(self, filePath):

getInfo = {‘Phone’: None, ‘Email’: None}

# 以二进制读模式打开

file = open(filePath, ‘rb’)

# 用文件对象来创建一个 pdf 文档分析器

praser = PDFParser(file)

# 创建一个 PDF 文档对象存储文档结构, 提供密码初始化,没有就不用传该参数

doc = PDFDocument(praser, password=”)

# 检查文件是否允许文本提取

if not doc.is_extractable:

raise PDFTextExtractionNotAllowed

# 创建 PDf 资源管理器 来管理共享资源,#caching = False 不缓存

rsrcmgr = PDFResourceManager(caching = False)

# 创建一个 PDF 设备对象

laparams = LAParams()

# 创建一个 PDF 页面聚合对象

device = PDFPageAggregator(rsrcmgr, laparams=laparams)

# 创建一个 PDF 解析器对象
外汇赠金活动 http://www.fx61.com/activities

interpreter = PDFPageInterpreter(rsrcmgr, device)

# 获得文档的目录(纲要), 文档没有纲要会报错

# PDF 文档没有目录时会报:raise PDFNoOutlines pdfminer.pdfdocument.PDFNoOutlines

# print(doc.get_outlines())

# 获取 page 列表

print(PDFPage.get_pages(doc))

# 循环遍历列表,每次处理一个 page 的内容

for page in PDFPage.create_pages(doc):

interpreter.process_page(page)

# 接受该页面的 LTPage 对象

layout = device.get_result()

# 这里 layout 是一个 LTPage 对象 里面存放着 这个 page 解析出的各种对象

# 一般包括 LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等

for x in layout:

if hasattr(x, ‘get_text’):

fileNames = os.path.splitext(filePath)

results = x.get_text()

# print(‘###’ + results)

# 匹配邮箱

emailRegex = re.compile(r”'(

[a-zA-Z0-9._%+-]+ # 邮箱用户名

@ # @ symbol

[a-zA-Z0-9.-]+ # 域名

(.[a-zA-Z]{2,4}) # 域名后缀

)”’, re.VERBOSE)

matchedEmail = emailRegex.search(results)

if matchedEmail:

# 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)

if matchedPhone:

# print(matchedPhone.group())

phoneNumber = matchedPhone.group()

phoneNumber = phoneNumber.replace(‘ ‘, ”) # 去除空格

phoneNumber = phoneNumber.replace(‘-‘, ”) # 去除 ‘-‘

phoneNumber = phoneNumber.replace(‘.’, ”) # 去除 ‘.’

getInfo[‘Phone’] = phoneNumber

return getInfo

”’

step 3:

保存求职者信息到 Excel 文件

”’

print(‘\n 简历信息提取 …’)

dirs = os.listdir(SaveFolderPath) # 搜索目录

pdf2TxtManager = CPdf2TxtManager()

wb = Workbook() # 创建文件对象

ws = wb.active # 获取第一个 sheet

# 将数据写入到指定的单元格

ws[‘A1’] = ‘ 姓名 ’

ws[‘B1’] = ‘ 电话 ’

ws[‘C1’] = ‘ 邮箱 ’

# 提取求职者的联系方式,并写入 Excel 文件对象

i = 2

for file in dirs:

retInfo = pdf2TxtManager.changePdfToText(SaveFolderPath + ‘\\’ + file)

name = re.findall(r'(.*?).pdf’,file)[0]

print(‘\n

退出移动版