2008-09-22 7 views
43

Я хотел бы найти файл Word 2007 (.docx) для текстовой строки, например «некоторая специальная фраза», которая может быть найдена в результате поиска в Word.Как я могу найти слово в файле .docx Word 2007?

Есть ли способ из Python просмотреть текст? У меня нет интереса к форматированию - я просто хочу классифицировать документы как имеющие или не имеющие «какую-то особую фразу».

ответ

32

Более точно, документ .docx является архивом Zip в формате OpenXML: сначала его нужно распаковать.
Я загрузил образец (Google: некоторый термин поиска filetype: docx), и после распаковки я нашел несколько папок. В папке содержится сам документ, в файле document.xml.

+0

Ya я получить все XML file.Now я хочу спросить вас, как мы можем получить все значения, такие как (жирный, курсив, цвет, фон, пространство) и все параметры форматирования. Как мы можем получить эти значения из xml. – user1006544 2011-12-17 10:46:56

4

Docx - это всего лишь zip-архив с большим количеством файлов внутри. Может быть, вы можете посмотреть на некоторые из этих файлов? Помимо этого вам, вероятно, придется найти библиотеку, которая понимает формат слова, чтобы вы могли отфильтровывать то, что вас не интересует.

Второй выбор состоял бы в том, чтобы взаимодействовать со словом и выполнять поиск через него.

2

Файл docx - это, по существу, zip-файл с XML-файлом внутри него.
xml содержит форматирование, но также содержит текст.

0

Вы должны использовать интерфейс MSWord ActiveX для извлечения текста для поиска (или, возможно, поиска). Я понятия не имею, как вы получаете доступ к ActiveX с Python.

1

OLE Automation, вероятно, будет самым простым. Вы должны рассмотреть форматирование, так как текст может выглядеть следующим образом в XML:

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

Там нет простого способа найти, что с помощью простого текстового сканирования.

16

В этом примере «Course Outline.docx» является документом Word 2007, который содержит слово «Windows» и не содержит фразу «случайная другая строка».

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

В принципе, вы просто открыть файл DOCX (который является почтовым архивом) с помощью zipfile и найти содержание в файле «document.xml» в папке «слово». Если вы хотите быть более сложным, вы могли бы затем parse the XML, но если вы просто ищете фразу (которая, как вы знаете, не будет тегом), вы можете просто посмотреть в XML для строки.

+2

Возможно, легче найти фразу в тексте элемента (используя синтаксический анализатор XML), чем беспокоиться о том, соответствует ли часть вашего текста названию элемента. – mikemaccana 2009-12-27 12:59:51

14

проблемы с поиском внутри файла документ XML Word, является то, что текст может быть разделен на элементы в любом символе. Он будет разделен, если форматирование отличается, например, как в 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 Interop другой через JPype. См. Руководство по программированию Aspose.Words, Utilize Aspose.Words на других языках программирования (извините, я не могу опубликовать вторую ссылку, stackoverflow еще не позволяет мне).

+1

`OOXML spec составляет около 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

Вы можете использовать docx2txt, чтобы получить текст внутри DOCX, чем поиск в этом формате TXT

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