Как извлечь данные из файла doc/docx с помощью Python

Я знаю, что есть похожие вопросы, но я не смог найти что-то, что ответило бы на мои молитвы. Что мне нужно, так это способ получить доступ к определенным данным из файлов MS-Word и сохранить их в файле XML. Чтение python-docx не помогло, так как кажется, что он позволяет только один писать в текстовые документы, а не читать. Чтобы точно представить мою задачу (или как я решил подойти к своей задаче): я хотел бы найти ключевое слово или фразу в документе (документ содержит таблицы) и извлечь текстовые данные из таблицы, где ключевое слово/фраза нашел. У кого-нибудь есть идеи?


person Stefan Urziceanu    schedule 31.03.2014    source источник
comment
Мне пришлось сделать что-то подобное с файлами xls/xlsx, но это было очень просто, так как есть библиотека openpyxl, которая позволяет делать довольно много вещей с электронными таблицами Excel. Но, похоже, в Python меньше поддерживается работа с файлами doc/docx.   -  person Stefan Urziceanu    schedule 31.03.2014


Ответы (4)


docx — это zip-файл, содержащий XML документа. Вы можете открыть zip, прочитать документ и проанализировать данные с помощью ElementTree.

Преимущество этого метода заключается в том, что вам не нужно устанавливать никаких дополнительных библиотек Python.

import zipfile
import xml.etree.ElementTree

WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
PARA = WORD_NAMESPACE + 'p'
TEXT = WORD_NAMESPACE + 't'
TABLE = WORD_NAMESPACE + 'tbl'
ROW = WORD_NAMESPACE + 'tr'
CELL = WORD_NAMESPACE + 'tc'

with zipfile.ZipFile('<path to docx file>') as docx:
    tree = xml.etree.ElementTree.XML(docx.read('word/document.xml'))

for table in tree.iter(TABLE):
    for row in table.iter(ROW):
        for cell in row.iter(CELL):
            print ''.join(node.text for node in cell.iter(TEXT))

См. мой ответ stackoverflow на Как читать содержимое таблицы в файле MS-Word с помощью Python? для получения дополнительных сведений и ссылок.

В ответ на комментарий ниже изображения не так четки для извлечения. Я создал пустой docx и вставил в него одно изображение. Затем я открываю файл docx в виде zip-архива (используя 7zip) и просматриваю document.xml. Вся информация об изображении хранится как атрибуты в XML, а не в CDATA, как текст. Итак, вам нужно найти интересующий вас тег и вытащить информацию, которую вы ищете.

Например, добавив в скрипт выше:

IMAGE = '{http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing}' + 'docPr'

for image in tree.iter(IMAGE):
    print image.attrib

выходы:

{'id': '1', 'name': 'Picture 1'}

Я не эксперт в формате openxml, но я надеюсь, что это поможет.

Я отмечаю, что zip-файл содержит каталог с именем media, который содержит файл с именем image1.jpeg, содержащий переименованную копию моего встроенного изображения. Вы можете просмотреть zip-файл docx, чтобы узнать, что доступно.

person Mike Robins    schedule 09.05.2016
comment
не могли бы вы указать тег NAMESPACE для изображения? я пробовал, но есть несколько подгонок, и случайно также те, которые для списков, которые я предположил, были ilvl. - person hewhomustnotbenamed; 05.01.2021
comment
Я добавил некоторую информацию к ответу выше, надеюсь, это поможет. - person Mike Robins; 06.01.2021
comment
большое спасибо, я пришел к такому же выводу в ту же ночь, исследуя - person hewhomustnotbenamed; 09.01.2021

Для поиска в документе с помощью 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')

У вас также есть функция для получения текста документа:

https://github.com/mikemaccana/python-docx/blob/master/docx.py#L910

# Import the module
from docx import *

# Open the .docx file
document = opendocx('A document.docx')
fullText=getdocumenttext(document)

Используя https://github.com/mikemaccana/python-docx

person edi9999    schedule 31.03.2014
comment
Если вы собираетесь захватывать ячейки в таблице с помощью docx, обязательно прочтите это, чтобы избежать проблем с производительностью: github.com/python-openxml/python-docx/issues/174 - person Soferio; 25.02.2016

Кажется, что pywin32 делает свое дело. Вы можете просмотреть все таблицы в документе и все ячейки внутри таблицы. Получить данные немного сложно (последние 2 символа из каждой записи должны быть опущены), но в остальном это десятиминутный код. Если кому-то нужны дополнительные подробности, пишите в комментариях.

person Stefan Urziceanu    schedule 08.04.2014
comment
Не могли бы вы опубликовать быстрый пример кода, чтобы сделать именно это? (например, выберите таблицу и прочитайте содержимое в переменную) Спасибо. - person dasen; 09.01.2015
comment
@dasen Здесь - person dashesy; 09.05.2016

Более простая библиотека с возможностью извлечения изображений.

pip install docx2txt


Затем используйте приведенный ниже код для чтения файла docx.

import docx2txt
text = docx2txt.process("file.docx")
person Krissh    schedule 09.09.2019