Вопрос по python, docx, openxml, ms-word – Как я могу найти слово в файле Word 2007 .docx?

45

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

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

Ваш Ответ

10   ответов
33

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

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

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

0

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

14

Проблема с поиском внутри XML-файла документа Word заключается в том, что текст может быть разбит на элементы по любому символу. Конечно, он будет разделен, если форматирование отличается, например, как в HelloWorld, Но этоcan быть разделенным в любой точке, и это действительно в 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 пока не позволяет мне).

OOXML spec is around 6000 pages long : Ты, должно быть, шутишь: O
148

Прочитав ваш пост выше, я сделал 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
Я думаю, что Nailer заслуживает мема. "Хороший парень наильщик. Видит, что у друга проблемы с кодом. Сам пишет библиотеку. & Quot;
1

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

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

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

4

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

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

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

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

16

В этом примере & quot; Course Outline.docx & quot; является документом 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»; файл в «слове» папка. Если вы хотите быть более сложным, вы могли бы тогдаразбирать XML, но если вы просто ищете фразу (которая, как вы знаете, не будет тегом), то вы можете просто найти в XML строку.

Вероятно, легче найти фразу в тексте элемента (используя синтаксический анализатор XML), чем беспокоиться о том, соответствует ли часть вашего текста имени элемента.
2

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

Похожие вопросы