2008-09-03 6 views
17

Есть ли разумный способ извлечь простой текст из файла Word, который не зависит от автоматизации COM? (Это функция для веб-приложения, развернутого на платформе, отличной от Windows). В этом случае это не подлежит обсуждению.)Лучший способ извлечь текст из Word-документа без использования COM/автоматизации?

Похоже, что это может быть разумным вариантом, но похоже, что он может быть отменен.

Решение Python было бы идеальным, но, похоже, оно не доступно.

ответ

9

Я использую catdoc или antiword для этого, независимо от результата, который легче всего анализировать. Я включил это в функции python, поэтому его легко использовать из системы синтаксического анализа (которая написана на 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() 

Переключатель -w в catdoc отключает обертывание линии, BTW.

+1

Обратите внимание, что питон 3 удаляет popen3 см https://docs.python.org/3/library/subprocess.html # replace-os-popen-os-popen2-os-popen3 – codeape

2

Использование API OpenOffice и Python, и Andrew Pitonyak's excellent online macro book мне удалось это сделать. Раздел 7.16.4 - это место для начала.

Еще один совет, чтобы заставить его работать без необходимости экран вообще должен использовать скрытые свойства:

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

В противном случае щелкает документ на экране (вероятно, на консоли веб-сервера), когда вы открываете его ,

17

(Тот же ответ, как extracting text from MS word files in python)

Используйте собственный модуль Python DOCX, который я сделал на этой неделе. Вот как извлечь весь текст из дока:

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) 

См Python DocX site

100% Python, ни COM, ни .net, ни Java, ни при разборе сериализованной XML с regexs, не дерьма.

+0

Большое спасибо за создание этой библиотеки. Я знаю, что вы опубликовали это 3 года назад, но есть ли способ преобразовать документ DOCX в HTML с помощью вашей библиотеки? Cheers –

+0

@mikemaccana может ли он также анализировать файлы .doc (not .docx)? – ofnowhere

+12

Если бы только был способ задать вопросы по StackOverflow. – mikemaccana

2

Если все, что вы хотите сделать, это извлечение текста из файлов Word (.docx), это можно сделать только с Python. Как писал Гай Старбак, вам просто нужно разархивировать файл, а затем проанализировать XML. Вдохновленный python-docx, я написал simple function, чтобы сделать это:

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

Большая часть кода! Небольшое замечание о вашем блоге, если фон кода не был черным, это было бы более читаемым. –

+0

О, спасибо за комментарий. Проблема в том, что я немного взломал Github CSS, чтобы цвета соответствовали моему сайту. Но когда Github вносит изменения в свой CSS, я должен снова изменить мою таблицу стилей, как сейчас. Не уверен, что буду придерживаться такого подхода ... – Etienne

0

This worked well для .doc и .odt.

Он вызывает openoffice в командной строке для преобразования вашего файла в текст, который затем можно просто загрузить в python.

(кажется, есть и другие варианты формата, хотя они не apparenlty документированы.)

 Смежные вопросы

  • Нет связанных вопросов^_^