7

我正在寻找一个优雅的解决方案来查找文档中的哪些页面上出现了我存储在 python 字典/列表中的某个单词。

我首先考虑将 .docx 格式作为输入,并查看了具有搜索功能的PythonDocx,但在 docx/xml 格式中显然没有真正的 pages 属性。如果我解析文档,我可以<w:br w:type="page"/>在 xml 树中查找事件,但不幸的是这些不显示非强制分页符。

我什至考虑先将文件转换为 PDF,然后使用PDFminer之类的东西逐页解析文档。

是否有任何直接的解决方案来搜索 .docx 文档中的字符串并返回它出现的页面

[('foo' ,[1, 4, 7 ]), ('bar', [2]), ('baz', [2, 5, 8, 9 )]
4

1 回答 1

3

解析构成 docx 的 xml 文件

您的问题中最大的挑战似乎是如何能够逐页解析文档。word 文档的这个答案并不总是相同的,它取决于页边距、纸张设置、您用来打开它的应用程序等。为此目的的任何脚本的准确性的一个很好的推理可以在google group找到.

但是,如果您对几乎 100% 的准确率感到满意,您将开始按照这个google 组中的建议找到解决方案: 

我发现我可以解压缩 .docx 文件并提取docProps/app.xml,然后使用 ElementTree 解析 XML 以获取<Pages></Pages>元素。我发现大多数时候这个数字是准确的,但我也看到过一些例子,该元素中的数字不正确。  

使用 Win32com.Client

另一种方法是win32com.client打开文件,对其进行分页,进行搜索,然后以您想要的格式返回结果。

您可以在此答案中找到语法示例:

from win32com.client import Dispatch
#open Word
word = Dispatch('Word.Application')
word.Visible = False
word = word.Documents.Open(doc_path)

#get number of sheets
word.Repaginate()
num_of_sheets = word.ComputeStatistics(2)

您还可以查看有关使用 win32com.client 在 word 文档中查找和替换的答案。

于 2016-01-22T22:31:40.997 回答