如何使用python-docx从现有docx文件中提取文本
我正在尝试使用 python-docx
模块(可以通过 pip install python-docx
安装),但感觉有点困惑。在 这个GitHub仓库 的测试示例中,他们使用了 opendocx
函数,而在 这个文档网站 上,他们使用的是 Document
类。虽然他们只是展示了如何向docx文件添加文本,而不是读取已有的文件?
第一个(opendocx
)似乎不工作,可能已经不再使用了。对于第二种情况,我试着使用:
from docx import Document
document = Document('test_doc.docx')
print(document.paragraphs)
结果返回了一个 <docx.text.Paragraph object at 0x... >
的列表。
然后我做了:
for p in document.paragraphs:
print(p.text)
结果返回了所有文本,但有一些内容缺失。所有的链接(按住CTRL并点击可以访问链接)在控制台的文本中没有出现。
这是什么问题?为什么链接会缺失?
我怎么才能获取完整的文本,而不需要一个个循环(像 open().read()
那样)?
6 个回答
使用python-docx,就像@Chinmoy Panda的回答所示:
for para in doc.paragraphs:
fullText.append(para.text)
不过,para.text
会丢失在 w:smarttag
中的文本(相关的GitHub问题在这里:https://github.com/python-openxml/python-docx/issues/328),你应该使用下面的函数:
def para2text(p):
rs = p._element.xpath('.//w:t')
return u" ".join([r.text for r in rs])
python-docx有两个“版本”。最初的版本是0.2.x,之后的新版本从0.3.0开始。新版本是对旧版本的全面重写,采用了面向对象的设计。你可以在这里找到它的独立代码库。
opendocx()这个函数属于旧版的API。这里的文档是针对新版本的。旧版本几乎没有什么文档可供参考。
当前版本不支持读取或写入超链接。这项功能在开发计划中,项目正在积极开发中。由于Word有很多功能,所以这个API的范围相当广泛。我们会在将来处理这个问题,但可能在下个月之前不会实现,除非有人专注于这个方面并进行贡献。 更新 超链接支持在这个回答之后被添加进来了。
不安装 python-docx
的方法
docx
文件其实就是一个压缩包,里面有好几个文件夹和文件。下面的链接里有一个简单的函数,可以从 docx
文件中提取文本,而不需要依赖 python-docx
和 lxml
,后者有时候安装起来比较麻烦:
http://etienned.github.io/posts/extract-text-from-word-docx-simply/
你可以使用 python-docx2txt 这个工具,它是从 python-docx 改编而来的,不仅可以提取文档中的文字,还能提取链接、标题和页脚的内容。它还可以提取图片。
你可以试试这个
import docx
def getText(filename):
doc = docx.Document(filename)
fullText = []
for para in doc.paragraphs:
fullText.append(para.text)
return '\n'.join(fullText)