Python使用docx2txt库提取Word文档内容及高级解析技巧
本文介绍Python中docx2txt库的安装与基本用法,演示如何通过命令行或代码从.docx文件中提取纯文本及图片。此外,深入探讨了利用python-docx库解析Word底层XML结构的方法,包括如何识别并提取目录(std标签)和文本框(textbox标签)内容,以及如何通过处理pPr标签还原段落格式,解决文本域保存不显示的问题。
docx2txt的Github地址
docx2txt是一个基于Python开发的工具库,主要用于从.docx格式的文件中提取文本和图片数据。
该库的代码灵感来源于python-docx项目,除了基础文本外,它还能提取页眉、页脚以及超链接中的文字内容。目前版本已支持图像提取功能。
安装
pip install docx2txt
运行
1、命令行运行
# extract text
docx2txt file.docx
# extract text and images
docx2txt -i /tmp/img_dir file.docx
2、在python中调用
# extract text
docx2txt file.docx
# extract text and images
docx2txt -i /tmp/img_dir file.docx
补充:python docx提取word中的目录及文本框中的文本
问题描述
python docx提取word中的目录及文本框中的文本
解决方案
由于标准的docx库未提供直接识别Word文档中目录和文本框内文本的方法,因此采用了一种基于XML解析的替代方案。具体思路是将Word文档解析为XML格式,通过查找特定的XML标签来定位并提取目录及文本框中的内容。
具体实现时,迭代文档的所有element元素。对于目录,其对应的tag为“std”,找到该节点后提取其所有文本即可得到目录内容;对于文本框,其tag为“textbox”,找到后需继续向下查找tag为 'r' 的子element,提取其中的文本即为文本框内的内容。
# 提取word目录
file = docx.Document(file_path)
children = file.element.body.iter()
child_iters = []
for child in children:
# 通过类型判断目录
if child.tag.endswith('main}sdt'):
for ci in child.iter():
if ci.text and ci.text.strip():
child_iters.append(ci)
catalog = [ci.text for ci in child_iters]
# 提取word文本框中文本
file = docx.Document(file_path)
children = file.element.body.iter()
child_iters = []
for child in children:
# 通过类型判断目录
if child.tag.endswith('textbox'):
for ci in child.iter():
if ci.tag.endswith('main}r'):
child_iters.append(ci)
textbox = [ci.text for ci in child_iters]
在确定文本域标签的过程中进行了多次尝试:初次使用AlternateContent标签,发现对部分文本域无效;第二次尝试pict标签,基本覆盖了测试用例中的所有文本域;第三次全面检查Word文档的标签结构后,发现使用textbox标签更为可靠,经测试能覆盖所有场景,因此最终选定该标签。
提取文本后发现,许多内容呈现为短语或单词形式,缺乏完整的句子结构。因此需要将这些提取的文本还原为段落格式。
file = docx.Document(file_path)
children = file.element.body.iter()
child_iters = []
tags = []
for child in children:
# 通过类型判断目录
if child.tag.endswith(('AlternateContent','textbox')):
for ci in child.iter():
tags.append(ci.tag)
if ci.tag.endswith(('main}r', 'main}pPr')):
child_iters.append(ci)
text = ['']
for ci in child_iters :
if ci.tag.endswith('main}pPr'):
text.append('')
else:
text[-1] += ci.text
ci.text = ''
trans_text = ['***'+t+'***' for t in text]
print(trans_text)
i, k = 0, 0
for ci in child_iters :
if ci.tag.endswith('main}pPr'):
i += 1
k = 0
elif k == 0:
ci.text = trans_text[i]
k = 1
file.save('E:/***/test.docx')
处理时,将标签pPr视为换行标志。在提取的文本每段前后添加“***”标记,随后将这些处理后的文本写回文档中。
注意:在此过程中发现,AlternateContent标签必须保留。如果忽略该标签,虽然可以提取文本域内的文字,但在修改文字并保存Word文档后,更改后的内容可能无法正确显示。
以上为个人经验分享,旨在提供参考。如有错误或考虑不周之处,欢迎指正。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













