Как я могу найти слово в файле Word 2007 .docx? - PullRequest
47 голосов
/ 22 сентября 2008

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

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

Ответы [ 10 ]

151 голосов
/ 30 декабря 2009

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

33 голосов
/ 22 сентября 2008

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

16 голосов
/ 23 сентября 2008

В этом примере «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 для строки.

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

4 голосов
/ 09 декабря 2014

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

npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout
4 голосов
/ 22 сентября 2008

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

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

2 голосов
/ 22 сентября 2008

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

1 голос
/ 23 сентября 2008

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

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

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

0 голосов
/ 18 октября 2008

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

0 голосов
/ 22 сентября 2008

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

...