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

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

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

10 ответов

Решение

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

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

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

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

Ты можешь использовать docx2txt чтобы получить текст внутри документа, чем искать в этом тексте

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

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

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

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

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

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

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

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

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

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