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

Ger*_*rry 47 python ms-word docx openxml

我想在Word 2007文件(.docx)中搜索文本字符串,例如,可以/可以从Word中的搜索中找到的"某些特殊短语".

有没有办法从Python看文本?我对格式化没兴趣 - 我只想将文档分类为是否有"某些特殊短语".

mik*_*ana 154

阅读上面的帖子后,我制作了一个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')
Run Code Online (Sandbox Code Playgroud)

docx模块位于https://python-docx.readthedocs.org/en/latest/

  • 我认为钉枪值得一个模因."好人钉枪,看到一个朋友的困扰与代码写入一个图书馆自己." (15认同)
  • 等等......你为这个问题编写了一个完整的模块?! (11认同)
  • @ 11684是的,我遇到了与海报相同的问题,我所能做的就是从Python调用.net或Java的可怕解决方案. (5认同)
  • r/programmerhumor 上有关此问题的帖子有近 30k 点赞 https://reddit.com/r/ProgrammerHumor/comments/11qbp1x/see_unknow_person_with_a_problem_in_stackoverflow/ (4认同)
  • 由于星号导入是一种反模式,我建议“from docx import document, opendocx” (3认同)
  • @Maarten 感谢您的提醒!我在 Reddit 上添加了一条名为“Otherwise-Ad7276”的回复。 (3认同)
  • 如果这之前获得[历史锁](https://meta.stackexchange.com/questions/126587/what-is-a-historical-lock-and-what-is-it-used-for) (3认同)
  • 如果我知道如何给你我的声望点,我会奖励他们 - 写一个解决方案 - 答案!所以我发了推文.非常感谢!(解决这个问题的总时间:25分钟,感谢有人为我编写代码) (2认同)
  • `opendocx` 和 `search` 在版本 v0.8.10 中不起作用。我找不到任何有关“搜索”的信息。“opendocx”现在似乎是“Document”。 (2认同)
  • 多么传奇啊。 (2认同)

Phi*_*Lho 34

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

  • 是的,我得到了所有的 xml 文件。现在我想问你,我们如何获取所有值,如(粗体、斜体、颜色、字体名、空格)和所有格式设置,我们如何从 xml 获取这些值。 (2认同)

Ton*_*yer 16

在此示例中,"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()
Run Code Online (Sandbox Code Playgroud)

基本上,您只需使用zipfile打开docx文件(这是一个zip存档),然后在'word'文件夹的'document.xml'文件中找到该内容.如果你想要更复杂,那么你可以解析XML,但是如果你只是在寻找一个短语(你知道它不是标签),那么你可以在XML中查找字符串.

  • 在元素文本中查找短语(使用XML解析器)可能更容易,而不必担心文本的一部分是否与元素名称匹配. (3认同)

rom*_*eok 14

在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>
Run Code Online (Sandbox Code Playgroud)

您当然可以将其加载到XML DOM树中(不确定这将在Python中是什么)并要求仅将文本作为字符串获取,但您可能最终会遇到许多其他"死胡同",因为OOXML规范是6000页长,MS Word可以写出许多你不期望的"东西".所以你最终可能会编写自己的文档处理库.

或者您可以尝试使用Aspose.Words.

它以.NET和Java产品的形式提供.两者都可以在Python中使用.一个通过COM Interop另一个通过JPype.请参阅Aspose.Words程序员指南,在其他编程语言中使用Aspose.Words(抱歉,我无法发布第二个链接,stackoverflow不允许我).

  • `OOXML 规范大约有 6000 页长`:你一定是在跟我开玩笑吧:O (2认同)

edi*_*999 5

您可以使用docx2txt获取 docx 中的文本,而不是在该 txt 中搜索

npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout
Run Code Online (Sandbox Code Playgroud)