2008-09-22 41 views
43

我想搜索一個Word 2007文件(.docx)作爲文本字符串,例如,「某些特殊的短語」,可以/將從Word中的搜索中找到。如何搜索Word 2007 .docx文件中的單詞?

有沒有從Python的方式看到文本?我對格式化沒有興趣 - 我只是想將文檔分類爲有或沒有「某些特殊詞組」。

回答

32

更確切地說,.docx文檔是OpenXML格式的Zip存檔文件:您首先需要對其進行解壓縮。
我下載了一個示例(Google:某些搜索字詞文件類型:docx),解壓縮後我找到了一些文件夾。 文件夾包含文件本身,文件document.xml

+0

雅我得到的所有的XML file.Now我想問你,我們如何獲得像(粗體,斜體,顏色,名字,空格)和所有格式設置的所有值,我們如何從XML獲取這個值。 – user1006544 2011-12-17 10:46:56

4

一個docx只是一個zip文件,裏面有很多文件。也許你可以看看這些文件的一些內容?除此之外,你可能必須找到一個理解單詞格式的庫,以便你可以過濾掉你不感興趣的東西。

第二種選擇是與單詞互操作並通過它進行搜索。

2

一個docx文件本質上是一個帶有xml的zip文件。
xml包含格式,但它也包含文本。

0

您應該能夠使用MSWord ActiveX接口來提取要搜索的文本(或者可能執行搜索)。我不知道如何從Python訪問ActiveX。

1

OLE自動化可能是最簡單的。你必須要考慮的格式,因爲文本可能看起來像這樣的XML:

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

有發現,沒有簡單的方法使用簡單的文本掃描。

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() 

基本上,你只需打開使用zipfile的DOCX文件(這是一個zip壓縮包),並且發現在「字」文件夾中的「document.xml中」文件中的內容。如果你想變得更加複雜,那麼你可以使用parse the XML,但是如果你只是在尋找一個短語(你知道它不會是一個標籤),那麼你可以在XML中查找字符串。

+2

在元素文本(使用XML解析器)中查找短語可能比您不必擔心部分文本是否與元素名稱匹配更容易。 – mikemaccana 2009-12-27 12:59:51

14

的問題與Word文檔的XML文件內搜索的文本可以分成在任何字符元素。如果格式不同,它肯定會被拆分,例如,您好:世界。但它可以在任何時候分裂,並在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不允許我)。

+1

`OOXML規範大約有6000頁長':你一定是在開玩笑吧:O – claws 2012-12-26 20:00:40

140

閱讀完上面的文章後,我製作了一個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/

+11

等等...你爲這個問題寫了一個完整的模塊?! – 11684 2013-02-10 21:34:10

4

您可以在TXT使用docx2txt得到DOCX中的文本,比搜索

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