Как найти слово в файле Word 2007 .docx?

Я хотел бы найти в файле Word 2007 (.docx) текстовую строку, например, «какую-то особую фразу», которую можно / можно было бы найти при поиске в Word.

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


person Gerry    schedule 22.09.2008    source источник


Ответы (10)


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

person PhiLho    schedule 22.09.2008
comment
Я получил весь файл xml. Теперь я хочу спросить вас, как мы можем получить все значения, такие как (жирный, курсив, цвет, имя, пробел) и все настройки форматирования, как мы можем получить эти значения из xml. - person user1006544; 17.12.2011

Прочитав ваш пост выше, я сделал 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/ < / а>

person mikemaccana    schedule 30.12.2009
comment
Подождите ... Вы написали целый модуль только для этого вопроса ?! - person 11684; 11.02.2013
comment
@ 11684 Да, у меня была та же проблема, что и с плакатом, и все, что я мог решить, это ужасные решения для вызова .net или Java из Python. - person mikemaccana; 11.02.2013
comment
Если бы я знал, как дать вам свои очки репутации, я бы наградил их за этот ответ "напишите решение"! Вместо этого я написал об этом в Твиттере. БОЛЬШОЕ СПАСИБО! (общее время для решения этой проблемы: 25 минут, спасибо тому, кто написал для меня код) - person Marc Maxmeister; 28.03.2013
comment
Я думаю, что Нейлер заслуживает мема. Хороший парень, гвоздильщик. Видит, что у друга возникла проблема с кодом. Библиотеку пишет сам. - person Vishwanath; 05.07.2013
comment
Поскольку импорт звездочки - это антипаттерн, я бы предложил from docx import document, opendocx - person mpiskore; 13.02.2019
comment
Хотя я искал C++ библиотеку, это действительно мотивирующий ответ ... - person Top-Master; 30.04.2019
comment
opendocxи search не работают в Выпуске v0.8.10. Я не смог найти никакой информации о search. opendocx похоже сейчас Document. - person Dirk Schiller; 24.04.2020

В этом примере «Структура курса.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 (который представляет собой zip-архив) с помощью zipfile и найдите содержимое файла «document.xml» в папке «word». Если вы хотите быть более сложным, вы можете проанализировать XML, но если вы просто ищете фразу (которая, как вы знаете, не будет тегом), вы можете просто поискать строку в XML.

person Tony Meyer    schedule 22.09.2008
comment
Вероятно, проще искать фразу в тексте элемента (используя синтаксический анализатор XML), чем беспокоиться о том, совпадает ли часть вашего текста с именем элемента. - person mikemaccana; 27.12.2009

Проблема с поиском внутри 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-взаимодействие, другой через JPype. См. Руководство программиста Aspose.Words, Использование Aspose.Words на других языках программирования (извините, я не могу опубликовать вторую ссылку, stackoverflow пока не позволяет).

person romeok    schedule 15.11.2009
comment
OOXML spec is around 6000 pages long: Ты что, издеваешься: О - person claws; 27.12.2012

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

Второй вариант - взаимодействовать со словом и выполнять поиск по нему.

person kokos    schedule 22.09.2008

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

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

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

person shoosh    schedule 22.09.2008

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

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

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

person ilitirit    schedule 22.09.2008

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

person Andy Brice    schedule 22.09.2008

Вы также можете рассмотреть возможность использования библиотеки из OpenXMLDeveloper.org

person billb    schedule 18.10.2008