使用docx2txt和正则表达式提取多个docx文本内容,并且将结果合并成DataFrame格式。
1. 提取文件路径 & 名称
需要提取文件夹中多个.docx文档,创建cv_list获取所有文件路径,doc_name是文件名,方便之后批量处理。
# 导入工具包
import pandas as pd
import jieba
import docx
import numpy as np
import re
import zipfile
import os
from bs4 import BeautifulSoup
import docx2txt
#提取文件路径和文件名
cv_list = [] #路径
doc_name = [] #文件名
for i in os.listdir(os.getcwd()):
a = os.path.splitext(os.getcwd() + "/" + i)#获取当前目录下所有文件的文件名
if a[1] == '.docx':#如果文件后缀
cv_list.append(os.getcwd()+"/"+i)
doc_name.append(i)
#创建表格
df = pd.DataFrame({'文件名':doc_name,'文件地址':cv_list})
df
2. 文本内容提取
提取文本的基本步骤:
1)首先是通过docx2txt.process()
将整篇docx文档转换为txt模式,再使用正则表达式将对应的文本提取出来;
2)使用def
将步骤1)打包成函数,用for
找出cv_list里的所有文件中的指定内容。
注意: 这种方法适合文档的格式都一致的情况。
文档格式一致的情况
例如:需要提取文档中的年龄资料。
# 查看文档内容
docx2txt.process('/Users/mac/Documents/python/Noet/003aaaa.docx')
#提取文档中的年龄内容
def extract_age(filepath):
text = docx2txt.process(filepath) #提取txt格式的内容
findword = u"(\d\d+岁)"#定位查询的内容、格式
pattern = re.compile(findword)
results = pattern.findall(text)
return results
#提取所有年龄内容
age=[]
for i in cv_list:
a=extract_age(i)
age.append(a)
print(age)
上面的代码,返回的每一个结果都带了[],并且有的是空值
接下来用个if…else…语句将所需要的内容提取出来,并且将空值标成NA
age=[]
for i in cv_list:
a=extract_age(i)
if len(a):
b=a[0]
else:
b='NA'
age.append(b)
print(age)
#将内容合并到表格中
df['年龄']=age
df
文档格式不一致
基于之前的步骤,处理格式不同的文档可以有两种解法:
方法一:提取文本内容后,先格式调整成一样,再提取文本。
方法二:设置不同的格式提取
方法二只适合处理文本格式不复杂,并且不同格式比较少的情况。如果处理的文件格式多样,比如提取简历内容,因为每个人的简历格式不同,批量处理则非常麻烦。
这个例子里,从网上取了两个不同的简历模版,虽然主体内容大致相同,都是年龄、工作经历等信息,但是由于格式不一样,提取所需的文字就比较复杂。比如左边aaaa文档的时间格式是YYYY.MM, 而另一个为YYYY/MM。
文档aaaa | 文档 |
---|---|
![]() | ![]() |
#提取文档aaaa的教育经历
def extract_eduZ(filepath):
text = docx2txt.process(filepath)
#删除时间符号
datepat=re.compile(r'\t(\d+).(\d+)')
str=datepat.sub(r'\1/\2',text)
datepat=re.compile(r'(\d+).(\d+)')
str=datepat.sub(r'\1/\2',str)
#删空格
str = re.sub("[ ]", "", str)
result=re.findall( "教育经历\n\n\d\d\d\d/\d+-(.+?)\xa0\xa0", str, re.S)
return result
#提取格式为YYYY/M的时间
def extract_edu(filepath):
text = docx2txt.process(filepath)
results=re.findall( "教育经历\n\n\d\d\d\d/\d+-(.+?)\n\n", text, re.S)
return results
# 提取所有文件的内容
eduA=[]
for i in cv_list:
#第一个if 用来更换查找格式
if 'aaaa' in i: #找出路径名称里有‘aaaa'的文件
a= extract_eduZ(i)
else:
a=extract_edu(i)
#第二个if转换结果内容
if len(a):
b=a[0]
else:
b='NA'
eduA.append(b)
print(eduA)
# 合并并查看结果
df['时间']=eduA
df
3. 总结
主要难点:
- 不同格式文档的处理
- 正则表达式的应用。