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解析器對象
        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 <%d> '%(i-1) + '='*50)
    print('姓名:' + name)
    print('電話:' + retInfo['Phone'])
    print('郵箱:' + retInfo['Email'])

    ws['A'+str(i)] = name  # 寫入姓名
    ws['B'+str(i)] = retInfo['Phone']  # 寫入電話
    ws['C'+str(i)] = retInfo['Email']  # 寫入郵箱
    i = i+1

# 保存爲resumes.xlsx
wb.save(FolderPath + '\\' + 'resumes.xlsx')

print('\n提取記錄已保存在' + FolderPath + '\\' + 'resumes.xlsx')
print('\n恭喜,提取完成,按任意鍵退出。')
input()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章