2008-09-03 51 views
17

¿Existe una forma razonable de extraer texto sin formato de un archivo de Word que no dependa de la automatización COM? (Esta es una función para una aplicación web implementada en una plataforma que no es de Windows; en este caso no es negociable)¿La mejor manera de extraer texto de un documento de Word sin usar COM/automatización?

Parece que Antiword podría ser una opción razonable, pero parece que podría abandonarse.

Una solución de Python sería ideal, pero no parece estar disponible.

Respuesta

9

Uso catdoc o antiword para esto, cualquiera que sea el resultado más fácil de analizar. He incorporado esto en las funciones de python, por lo que es fácil de usar desde el sistema de análisis sintáctico (que está escrito en python).

import os 

def doc_to_text_catdoc(filename): 
    (fi, fo, fe) = os.popen3('catdoc -w "%s"' % filename) 
    fi.close() 
    retval = fo.read() 
    erroroutput = fe.read() 
    fo.close() 
    fe.close() 
    if not erroroutput: 
     return retval 
    else: 
     raise OSError("Executing the command caused an error: %s" % erroroutput) 

# similar doc_to_text_antiword() 

El -w cambia a catdoc para desactivar el ajuste de línea, por cierto.

+1

Tenga en cuenta que Python 3 elimina popen3, ver https://docs.python.org/3/library/subprocess.html # replace-os-popen-os-popen2-os-popen3 – codeape

2

Uso de la API de OpenOffice, y Python, y Andrew Pitonyak's excellent online macro book logré hacerlo. La sección 7.16.4 es el lugar para comenzar.

otro consejo para hacer que funcione sin necesidad de la pantalla en todo es el uso de la propiedad Hidden:

RO = PropertyValue('ReadOnly', 0, True, 0) 
Hidden = PropertyValue('Hidden', 0, True, 0) 
xDoc = desktop.loadComponentFromURL(docpath,"_blank", 0, (RO, Hidden,)) 

De lo contrario, las películas de documentos en la pantalla (probablemente en la consola del servidor web) cuando se abre .

17

(La misma respuesta que extracting text from MS word files in python)

utilizar el módulo docx nativa de Python que hice esta semana. Así es como para extraer todo el texto de un documento:

document = opendocx('Hello world.docx') 

# This location is where most document content lives 
docbody = document.xpath('/w:document/w:body', namespaces=wordnamespaces)[0] 

# Extract all text 
print getdocumenttext(document) 

Ver Python DocX site

100% Python, sin COM, sin .net, sin Java, sin análisis sintáctico XML serializado con regexs, sin basura.

+0

Muchas gracias por crear esta biblioteca. Sé que publicaste esto hace 3 años, pero ¿hay alguna forma de convertir un documento DOCX a HTML utilizando tu biblioteca? Cheers –

+0

@mikemaccana ¿puede analizar archivos .doc (no .docx) también? – ofnowhere

+12

Si hubiera alguna manera de hacer preguntas en StackOverflow. – mikemaccana

2

Si todo lo que quiere hacer es extraer texto de archivos de Word (.docx), solo puede hacerlo con Python. Al igual que Guy Starbuck lo escribió, solo necesita descomprimir el archivo y luego analizar el XML. Inspirado por python-docx, he escrito un simple function para hacer esto:

try: 
    from xml.etree.cElementTree import XML 
except ImportError: 
    from xml.etree.ElementTree import XML 
import zipfile 


""" 
Module that extract text from MS XML Word document (.docx). 
(Inspired by python-docx <https://github.com/mikemaccana/python-docx>) 
""" 

WORD_NAMESPACE = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}' 
PARA = WORD_NAMESPACE + 'p' 
TEXT = WORD_NAMESPACE + 't' 


def get_docx_text(path): 
    """ 
    Take the path of a docx file as argument, return the text in unicode. 
    """ 
    document = zipfile.ZipFile(path) 
    xml_content = document.read('word/document.xml') 
    document.close() 
    tree = XML(xml_content) 

    paragraphs = [] 
    for paragraph in tree.getiterator(PARA): 
     texts = [node.text 
       for node in paragraph.getiterator(TEXT) 
       if node.text] 
     if texts: 
      paragraphs.append(''.join(texts)) 

    return '\n\n'.join(paragraphs) 
+0

¡Gran pedazo de código! Un pequeño comentario sobre su blog, si el fondo del código no fuera negro, sería más legible. –

+0

Oh, gracias por el comentario. El problema es que 'pirateé' un poco el CSS de Github para que los colores coincidan con mi sitio. Pero cuando Github realiza cambios en su CSS, tengo que parchear mi hoja de estilos nuevamente, como ahora. No estoy seguro de que mantendré este enfoque ... – Etienne

0

This worked well para .doc y .odt.

Llama a openoffice en la línea de comandos para convertir su archivo en texto, que luego puede simplemente cargar en python.

(Parece tener otras opciones de formato, aunque no están documentados apparenlty.)

Cuestiones relacionadas