如何在Word 2007 .docx文件中搜索单词?
我想在Word 2007文件(.docx)中搜索文本字符串,例如可以从Word中的搜索中找到的"某些特殊短语"。
Python有没有办法查看文本?我对格式化没有兴趣,我只想将文档归类为具有或者不具有"某些特殊短语"。
解决方案
docx只是一个zip存档,其中包含许多文件。也许我们可以查看这些文件的某些内容?除此之外,我们可能还必须找到一个能够理解单词格式的库,以便过滤掉我们不感兴趣的内容。
第二种选择是与单词互操作并通过单词进行搜索。
docx文件本质上是一个内部带有xml的zip文件。
xml包含格式,但也包含文本。
我们应该能够使用MSWord ActiveX界面提取要搜索的文本(或者可能进行搜索)。我不知道我们如何从Python访问ActiveX。
更确切地说,.docx文档是OpenXML格式的Zip存档:我们必须首先解压缩它。
我下载了一个示例(Google:一些搜索词文件类型:docx),解压缩后找到了一些文件夹。 word文件夹在文件document.xml中包含文档本身。
OLE自动化可能是最简单的。我们必须考虑格式,因为XML中的文本可能如下所示:
<b>Looking <i>for</i> this <u>phrase</u>
使用简单的文本扫描找不到简单的方法。
在此的示例" Course Outline.docx"是一个Word 2007文档,它确实包含单词" Windows",并且不包含短语" random other string"。
>>> import zipfile >>> z = zipfile.ZipFile("Course Outline.docx") >>> "Windows" in z.read("word/document.xml") True >>> "random other string" in z.read("word/document.xml") False >>> z.close()
基本上,我们只是使用zipfile打开docx文件(这是一个zip存档),然后在" word"文件夹中的" document.xml"文件中找到内容。如果我们想变得更复杂,则可以解析XML,但是如果我们只是在寻找短语(我们知道不会是标签),则可以在XML中查找字符串。
我们也可以考虑使用OpenXMLDeveloper.org中的库
在Word文档XML文件中进行搜索时遇到的一个问题是,文本可以分为任意字符的元素。如果格式不同(例如在Hello World中),则肯定会将其拆分。但是它可以随时拆分,并且在OOXML中是有效的。因此,即使格式化在短语中间没有变化,我们也将最终像这样处理XML!
<w:p w:rsidR="00C07F31" w:rsidRDefault="003F6D7A"> <w:r w:rsidRPr="003F6D7A"> <w:rPr> <w:b /> </w:rPr> <w:t>Hello</w:t> </w:r> <w:r> <w:t xml:space="preserve">World.</w:t> </w:r> </w:p>
当然,我们可以将其加载到XML DOM树中(不确定在Python中会是什么),并要求仅以字符串形式获取文本,但是由于OOXML规范存在,我们可能会遇到许多其他"死胡同"的情况长达6000页,MS Word可以编写许多我们不期望的"内容"。因此,我们最终可能会编写自己的文档处理库。
或者,我们可以尝试使用Aspose.Words。
它可以作为.NET和Java产品获得。两者都可以在Python中使用。一个通过COM Interop,另一个通过JPype。请参阅《 Aspose.Words程序员指南》,《使用其他编程语言中的Aspose.Words》(抱歉,我无法发布第二个链接,stackoverflow还不允许我这样做)。
在阅读完我们上面的文章之后,我制作了100%本机Python docx模块来解决此特定问题。
# Import the module from docx import * # Open the .docx file document = opendocx('A document.docx') # Search returns true if found search(document,'your search string')
docx模块位于https://python-docx.readthedocs.org/en/latest/