Queremos compartirte la mejor solución que descubrimos en internet. Esperamos que te resulte de mucha ayuda y si deseas compartir alguna mejora hazlo con total libertad.
Solución:
El docx es un archivo zip que contiene un XML del documento. Puede abrir el zip, leer el documento y analizar los datos con ElementTree.
La ventaja de esta técnica es que usted no necesita bibliotecas de python adicionales instalado.
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('') 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))
Vea mi respuesta de stackoverflow a ¿Cómo leer el contenido de una tabla en un archivo de MS-Word usando Python? para más detalles y referencias.
En respuesta a un comentario a continuación, las imágenes no son tan claras para extraer. Creé un docx vacío e inserté una imagen en él. Luego abro el archivo docx como un archivo zip (usando 7zip) y miro el documento.xml. Toda la información de la imagen se almacena como attributes en el XML no es el CDATA como el texto. Por lo tanto, debe encontrar la etiqueta que le interesa y extraer la información que está buscando.
Por ejemplo, agregando al script anterior:
IMAGE = 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing' + 'docPr'
for image in tree.iter(IMAGE):
print image.attrib
salidas:
'id': '1', 'name': 'Picture 1'
No soy un experto en el formato openxml, pero espero que esto ayude.
Observo que el archivo zip contiene un directorio llamado medios que contiene un archivo llamado image1.jpeg que contiene una copia renombrada de mi imagen incrustada. Puede buscar en el archivo zip docx para investigar qué hay disponible.