如何在Word 2007的.docx文件中搜索单词?

84

我想搜索一个Word 2007文件(.docx)中的文本字符串,例如"some special phrase",这可以在Word中进行搜索。

从Python中是否有一种方法来查看文本?我对格式没有兴趣-我只想将文档分类为具有或不具有"some special phrase"。

10个回答

432
阅读了您上面的帖子后,我制作了一个100%本地的Python docx模块来解决这个特定问题。
# Import the module
from docx import document, opendocx

# 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/


62
等一下...你为这个问题写了一个整模块?! - 11684
54
是的,我和发帖者遇到了同样的问题,但我只找到了一些可怕的解决方案来从Python中调用.NET或Java。 - mikemaccana
9
如果我知道如何给你我的声望积分,我会为这个“写一个解决方案”的答案颁发奖励!所以我转而发了一条推文。非常感谢!(解决这个问题的总时间为25分钟,感谢有人为我编写代码) - Marc Maxmeister
29
我认为"Nailer"值得被制作成一个梗文。"好人Nailer,看到朋友在苦恼某个代码,于是自己写了一个库。" - Vishwanath
4
在r/programmerhumor上发布的一篇帖子已经获得了近30k个赞 https://reddit.com/r/ProgrammerHumor/comments/11qbp1x/see_unknow_person_with_a_problem_in_stackoverflow/ - Maarten
显示剩余8条评论

42
更确切地说,.docx文档是OpenXML格式的Zip归档文件:您首先需要解压缩它。
我下载了一个示例(谷歌:一些搜索词汇 filetype:docx),解压后找到了一些文件夹。 Word文件夹包含文档本身,存储在document.xml文件中。

2
我已经获取了所有的XML文件。现在我想问你,我们如何从XML中获取所有值,例如(粗体、斜体、颜色、字体名称、间距)以及所有格式设置?我们如何从XML中获取这些值? - user1006544

21
在这个例子中,“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中查找字符串即可。


5
使用XML解析器在元素文本中查找短语可能更容易,而无需担心您的文本的一部分是否与元素名称匹配。 - mikemaccana

20
在搜索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互操作,另一个通过JPype。请参阅Aspose.Words程序员指南,利用其他编程语言中的Aspose.Words(很抱歉我不能发布第二个链接,stackoverflow还没有允许我这样做)。

2
OOXML规范大约有6000页长:你一定在开玩笑 :O - claws

5
您可以使用docx2txt将docx文件内的文本提取出来,然后在该文本中进行搜索。
npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout

4
一个docx文件只是一个包含许多文件的zip归档文件。也许你可以查看这些文件的一些内容?除此之外,你可能需要找到一个能够理解Word格式的库,以便过滤掉你不感兴趣的内容。
第二种选择是与Word进行交互,并通过它进行搜索。

2

docx文件本质上是一个带有XML的zip文件。
XML包含了格式,但也包含了文本。


1

OLE Automation可能是最简单的。您必须考虑格式,因为文本在XML中可能看起来像这样:

<b>Looking <i>for</i> this <u>phrase</u>

使用简单的文本扫描找到这个并不容易。


0

您应该能够使用MSWord ActiveX接口来提取要搜索的文本(或者可能进行搜索)。但我不知道如何从Python访问ActiveX。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接