【发布时间】:2010-09-12 01:58:37
【问题描述】:
我想在 Word 2007 文件 (.docx) 中搜索文本字符串,例如,可以/将在 Word 中搜索的“一些特殊短语”。
有没有办法从 Python 中查看文本?我对格式没有兴趣 - 我只想将文档分类为具有或不具有“某些特殊短语”。
【问题讨论】:
标签: python ms-word openxml docx
我想在 Word 2007 文件 (.docx) 中搜索文本字符串,例如,可以/将在 Word 中搜索的“一些特殊短语”。
有没有办法从 Python 中查看文本?我对格式没有兴趣 - 我只想将文档分类为具有或不具有“某些特殊短语”。
【问题讨论】:
标签: python ms-word openxml docx
看了你上面的帖子,我做了一个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')
【讨论】:
opendocxand search 在版本 v0.8.10 中不起作用。我找不到任何关于search 的信息。 opendocx 现在好像是Document。
更准确地说,.docx 文档是 OpenXML 格式的 Zip 存档:您必须先解压缩它。
我下载了一个示例(Google:some search term filetype:docx),解压后我发现了一些文件夹。 word 文件夹包含文档本身,在文件 document.xml 中。
【讨论】:
在 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
在本例中,“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 中查找字符串。
【讨论】:
您可以使用docx2txt 获取 docx 中的文本,而不是在该 txt 中搜索
npm install -g docx2txt
docx2txt input.docx # This will print the text to stdout
【讨论】:
docx 只是一个包含大量文件的 zip 存档。也许你可以看看那些文件的一些内容?除此之外,您可能必须找到一个理解单词格式的库,以便您可以过滤掉您不感兴趣的内容。
第二种选择是与 word 互操作并通过它进行搜索。
【讨论】:
docx 文件本质上是一个 zip 文件,其中包含一个 xml。
xml 包含格式,但它也包含文本。
【讨论】:
OLE 自动化可能是最简单的。您必须考虑格式化,因为 XML 中的文本可能如下所示:
<b>Looking <i>for</i> this <u>phrase</u>
使用简单的文本扫描很难找到它。
【讨论】:
您应该能够使用 MSWord ActiveX 界面提取要搜索的文本(或者,可能进行搜索)。我不知道你是如何从 Python 访问 ActiveX 的。
【讨论】:
你也可以考虑使用OpenXMLDeveloper.org的库
【讨论】: