Я хотел бы найти в файле Word 2007 (.docx) текстовую строку, например, «некоторую специальную фразу», которую можно / можно было бы найти при поиске в Word.
Есть ли способ из Python увидеть текст? Меня не интересует форматирование - я просто хочу классифицировать документы как имеющие или не имеющие «какую-то особую фразу».






Docx - это просто zip-архив с большим количеством файлов внутри. Может быть, вы можете посмотреть содержимое этих файлов? Помимо этого, вам, вероятно, придется найти библиотеку, которая понимает формат слова, чтобы вы могли отфильтровать вещи, которые вам не интересны.
Второй вариант - взаимодействовать со словом и выполнять поиск по нему.
docx-файл - это, по сути, zip-файл с XML-файлом внутри него. xml содержит форматирование, но также содержит текст.
Вы должны иметь возможность использовать интерфейс MSWord ActiveX для извлечения текста для поиска (или, возможно, для поиска). Я понятия не имею, как получить доступ к ActiveX из Python.
Точнее, документ .docx - это Zip-архив в формате OpenXML: сначала его нужно распаковать. Я загрузил образец (Google: некоторый тип файла поискового запроса: docx) и после распаковки обнаружил несколько папок. Папка слово содержит сам документ в файле document.xml.
OLE-автоматизация, вероятно, была бы самой простой. Вы должны подумать о форматировании, потому что текст в XML может выглядеть так:
<b>Looking <i>for</i> this <u>phrase</u>
Нет простого способа найти это с помощью простого сканирования текста.
В этом примере «Схема курса.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-архив) с помощью zip-файл и находите содержимое в файле «document.xml» в папке «word». Если вы хотите быть более сложным, вы могли бы тогда проанализировать XML, но если вы просто ищете фразу (которая, как вы знаете, не будет тегом), вы можете просто поискать строку в XML.
Вероятно, проще искать фразу в тексте элемента (используя синтаксический анализатор XML), чем беспокоиться о том, совпадает ли часть вашего текста с именем элемента.
Вы также можете рассмотреть возможность использования библиотеки из OpenXMLDeveloper.org
Проблема с поиском внутри XML-файла документа Word заключается в том, что текст можно разбить на элементы по любому символу. Он обязательно будет разделен, если форматирование отличается, например, как в Hello Мир. Но может может быть разделен в любой момент, и это действительно в 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: Ты, должно быть, шутишь: О
Прочитав ваш пост выше, я сделал 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 Да, у меня была та же проблема, что и с плакатом, и все, что я мог решить, это ужасные решения для вызова .net или Java из Python.
Если бы я знал, как дать вам свои очки репутации, я бы наградил их за этот ответ "напишите решение"! Вместо этого я написал об этом в Твиттере. БОЛЬШОЕ СПАСИБО! (общее время для решения этой проблемы: 25 минут, спасибо тому, кто написал для меня код)
Я думаю, что Нейлер заслуживает мема. «Хороший гвоздь. Видит, что у друга проблемы с кодом. Сам пишет библиотеку».
Поскольку импорт звездочки - это антипаттерн, я бы предложил from docx import document, opendocx
Хотя я искал библиотеку C++, это действительно мотивирующий ответ ...
opendocx и search не работают в версии 0.8.10. Я не смог найти никакой информации о search. opendocx, похоже, теперь Document.
Вы можете использовать docx2txt, чтобы получить текст внутри docx, чем искать в этом txt
npm install -g docx2txt
docx2txt input.docx # This will print the text to stdout
Я получил весь файл xml. Теперь я хочу спросить вас, как мы можем получить все значения, такие как (жирный, курсив, цвет, имя файла, пробел) и все настройки форматирования, как мы можем получить эти значения из xml.