2008-09-03 9 views
17

Existe-t-il un moyen raisonnable d'extraire du texte brut à partir d'un fichier Word qui ne dépend pas de l'automatisation COM? (Ceci est une fonctionnalité pour une application web déployée sur une plate-forme non-Windows - ce n'est pas négociable dans ce cas.)La meilleure façon d'extraire du texte à partir d'un document Word sans utiliser COM/automation?

Antiword semble être une option raisonnable, mais il semble qu'elle puisse être abandonnée.

Une solution Python serait idéale, mais ne semble pas être disponible.

Répondre

9

J'utilise catdoc ou antiword pour cela, quel que soit le résultat qui soit le plus facile à analyser. J'ai intégré ceci dans les fonctions python, donc il est facile à utiliser depuis le système d'analyse (qui est écrit 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() 

L'option -w de catdoc désactive le retour à la ligne, BTW.

+1

Notez que python 3 supprime popen3, voir https://docs.python.org/3/library/subprocess.html # remplacement-os-popen-os-popen2-os-popen3 – codeape

2

Utilisation de l'API OpenOffice et Python, et je Andrew Pitonyak's excellent online macro book réussi à le faire. La section 7.16.4 est l'endroit où commencer.

Une autre astuce pour le faire fonctionner sans avoir besoin de l'écran du tout est d'utiliser la propriété cachée:

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

Sinon le document flicks sur l'écran (probablement sur la console serveur Web) lorsque vous l'ouvrez .

17

(Même réponse que extracting text from MS word files in python)

Utilisez le module natif Python docx que je fait cette semaine. Voilà comment extraire tout le texte d'un document:

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) 

Voir Python DocX site

100% Python, pas COM, pas .net, pas Java, pas d'analyse XML sérialisé avec regexs, pas de la merde.

+0

Merci beaucoup d'avoir créé cette bibliothèque. Je sais que vous l'avez posté il y a 3 ans, mais existe-t-il un moyen de convertir un document DOCX en HTML en utilisant votre bibliothèque? Cheers –

+0

@mikemaccana peut-elle analyser les fichiers .doc (pas .docx) aussi? – ofnowhere

+12

Si seulement il y avait un moyen de poser des questions sur StackOverflow. – mikemaccana

2

Si tout ce que vous voulez faire est d'extraire du texte à partir de fichiers Word (.docx), il est possible de le faire uniquement avec Python. Comme l'a écrit Guy Starbuck, il suffit de décompresser le fichier, puis d'analyser le XML. Inspiré par python-docx, je l'ai écrit un simple function à faire:

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

Super morceau de code! Une petite remarque sur ton blog, si l'arrière-plan du code n'était pas noir, ça serait plus lisible. –

+0

Oh, merci pour le commentaire. Le problème est que j'ai 'piraté' un peu le CSS Github donc les couleurs correspondent à mon site. Mais quand Github apporte des modifications à leur CSS, je dois encore patcher ma feuille de style, comme maintenant. Pas sûr de garder cette approche ... – Etienne

0

This worked well pour .doc et .odt.

Il appelle openoffice sur la ligne de commande pour convertir votre fichier en texte, que vous pouvez ensuite simplement charger dans python.

(Il semble avoir d'autres options de format, mais ils ne sont pas apparenlty documentés.)

Questions connexes