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

StackOverflow https://stackoverflow.com/questions/116139

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

Прочитав ваш пост выше, я создал на 100% собственный docx-модуль Python для решения этой конкретной проблемы.

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

Проблема с поиском внутри 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.Слова.

Он доступен в виде продуктов .NET и Java.Оба можно использовать из Python.Один через COM Interop, другой через JPype.См. Руководство программиста Aspose.Words, Использование Aspose.Words на других языках программирования (извините, я не могу опубликовать вторую ссылку, stackoverflow мне пока не позволяет).

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top