共计 3509 个字符,预计需要花费 9 分钟才能阅读完成。
当你想批量提取文档 (如简历) 中的电话和邮箱,可以参考以下代码:
提取结果保存在“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