【问题标题】:How can I search a word in a Word 2007 .docx file?如何在 Word 2007 .docx 文件中搜索单词?
【发布时间】:2010-09-12 01:58:37
【问题描述】:

我想在 Word 2007 文件 (.docx) 中搜索文本字符串,例如,可以/将在 Word 中搜索的“一些特殊短语”。

有没有办法从 Python 中查看文本?我对格式没有兴趣 - 我只想将文档分类为具有或不具有“某些特殊短语”。

【问题讨论】:

    标签: python ms-word openxml docx


    【解决方案1】:

    看了你上面的帖子,我做了一个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/

    【讨论】:

    • 等等...你写了一个完整的模块只是为了这个问题?!
    • @11684 是的,我遇到了和发帖人一样的问题,我所能做的只是从 Python 调用 .net 或 Java 的可怕解决方案。
    • 如果我知道如何给你我的声望点,我会奖励他们这个 -write-a-solution- 答案!所以我改为发推文。非常感谢! (解决这个问题的总时间:25分钟,感谢有人为我编写代码)
    • 我认为 nailer 值得一个模因。 “钉钉好人。看到朋友被代码困扰。自己写了一个库。”
    • opendocxand search 在版本 v0.8.10 中不起作用。我找不到任何关于search 的信息。 opendocx 现在好像是Document
    【解决方案2】:

    更准确地说,.docx 文档是 OpenXML 格式的 Zip 存档:您必须先解压缩它。
    我下载了一个示例(Google:some search term filetype:docx),解压后我发现了一些文件夹。 word 文件夹包含文档本身,在文件 document.xml 中。

    【讨论】:

    • 是的,我得到了所有的 xml 文件。现在我想问你,我们怎样才能得到所有的值,比如(粗体、斜体、颜色、字体名、空格)和所有的格式设置,怎样才能我们从 xml 中获取这些值。
    【解决方案3】:

    在 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 还不允许我这样做)。

    【讨论】:

    • OOXML spec is around 6000 pages long : 你一定是在开玩笑吧 :O
    【解决方案4】:

    在本例中,“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' 文件中找到内容。如果你想更复杂,你可以parse the XML,但如果你只是在寻找一个短语(你知道它不会是一个标签),那么你可以在 XML 中查找字符串。

    【讨论】:

    • 在元素文本中查找短语(使用 XML 解析器)可能比担心部分文本是否与元素名称匹配更容易。
    【解决方案5】:

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

    npm install -g docx2txt
    docx2txt input.docx # This will  print the text to stdout
    

    【讨论】:

      【解决方案6】:

      docx 只是一个包含大量文件的 zip 存档。也许你可以看看那些文件的一些内容?除此之外,您可能必须找到一个理解单词格式的库,以便您可以过滤掉您不感兴趣的内容。

      第二种选择是与 word 互操作并通过它进行搜索。

      【讨论】:

        【解决方案7】:

        docx 文件本质上是一个 zip 文件,其中包含一个 xml。
        xml 包含格式,但它也包含文本。

        【讨论】:

          【解决方案8】:

          OLE 自动化可能是最简单的。您必须考虑格式化,因为 XML 中的文本可能如下所示:

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

          使用简单的文本扫描很难找到它。

          【讨论】:

            【解决方案9】:

            您应该能够使用 MSWord ActiveX 界面提取要搜索的文本(或者,可能进行搜索)。我不知道你是如何从 Python 访问 ActiveX 的。

            【讨论】:

              【解决方案10】:

              你也可以考虑使用OpenXMLDeveloper.org的库

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-13
                • 1970-01-01
                • 2016-11-25
                • 2022-12-06
                相关资源
                最近更新 更多