Я знаю, что есть похожие вопросы, но я не смог найти что-то, что ответило бы на мои молитвы. Что мне нужно, так это способ получить доступ к определенным данным из файлов MS-Word и сохранить их в файле XML. Чтение python-docx не помогло, так как кажется, что он позволяет только один писать в текстовые документы, а не читать. Чтобы точно представить мою задачу (или как я решил подойти к своей задаче): я хотел бы найти ключевое слово или фразу в документе (документ содержит таблицы) и извлечь текстовые данные из таблицы, где ключевое слово/фраза нашел. У кого-нибудь есть идеи?
Как извлечь данные из файла doc/docx с помощью Python
Ответы (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, чтобы узнать, что доступно.
Для поиска в документе с помощью 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
Кажется, что pywin32 делает свое дело. Вы можете просмотреть все таблицы в документе и все ячейки внутри таблицы. Получить данные немного сложно (последние 2 символа из каждой записи должны быть опущены), но в остальном это десятиминутный код. Если кому-то нужны дополнительные подробности, пишите в комментариях.
Более простая библиотека с возможностью извлечения изображений.
pip install docx2txt
Затем используйте приведенный ниже код для чтения файла docx.
import docx2txt
text = docx2txt.process("file.docx")