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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
49
0
44 779
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

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

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

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

Ответ принят как подходящий

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

Я получил весь файл xml. Теперь я хочу спросить вас, как мы можем получить все значения, такие как (жирный, курсив, цвет, имя файла, пробел) и все настройки форматирования, как мы можем получить эти значения из xml.

user1006544 17.12.2011 14:46

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), чем беспокоиться о том, совпадает ли часть вашего текста с именем элемента.

mikemaccana 27.12.2009 15:59

Вы также можете рассмотреть возможность использования библиотеки из 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: Ты, должно быть, шутишь: О

claws 27.12.2012 00:00

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

@ 11684 Да, у меня была та же проблема, что и с плакатом, и все, что я мог решить, это ужасные решения для вызова .net или Java из Python.

mikemaccana 11.02.2013 14:20

Если бы я знал, как дать вам свои очки репутации, я бы наградил их за этот ответ "напишите решение"! Вместо этого я написал об этом в Твиттере. БОЛЬШОЕ СПАСИБО! (общее время для решения этой проблемы: 25 минут, спасибо тому, кто написал для меня код)

Marc Maxmeister 28.03.2013 19:35

Я думаю, что Нейлер заслуживает мема. «Хороший гвоздь. Видит, что у друга проблемы с кодом. Сам пишет библиотеку».

Vishwanath 05.07.2013 11:26

Поскольку импорт звездочки - это антипаттерн, я бы предложил from docx import document, opendocx

mpiskore 13.02.2019 23:49

Хотя я искал библиотеку C++, это действительно мотивирующий ответ ...

Top-Master 30.04.2019 12:45

opendocx и search не работают в версии 0.8.10. Я не смог найти никакой информации о search. opendocx, похоже, теперь Document.

Dirk Schiller 24.04.2020 11:21

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

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

Другие вопросы по теме