Лучший способ извлечь текст из документа Word без использования COM / автоматизации?

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

Antiword кажется разумным вариантом, но, похоже, от него можно отказаться.

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
25
0
61 714
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Открытый офис имеет API

Мне удалось это сделать с помощью OpenOffice API, Python и Отличная онлайн-макро книга Андрея Питоняка. Раздел 7.16.4 - это место для начала.

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

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

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

Ответ принят как подходящий

Я использую для этого 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.

Обратите внимание, что python 3 удаляет popen3, см. docs.python.org/3/library/…

codeape 04.07.2016 16:56

Для файлов docx ознакомьтесь с Python-скриптом docx2txt, доступным по адресу

http://cobweb.ecn.purdue.edu/~kak/distMisc/docx2txt

для извлечения простого текста из документа docx.

(Тот же ответ, что и извлечение текста из файлов MS Word в 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

100% Python, без COM, без .net, без Java, без синтаксического анализа сериализованного XML с регулярными выражениями.

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

Bo Milanovich 20.04.2012 21:44

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

ofnowhere 19.06.2014 18:33

О файлах .doc спрашивайте как отдельный вопрос.

mikemaccana 21.12.2020 15:55

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

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)

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

Jean-Francois T. 24.11.2015 08:58

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

Etienne 24.11.2015 20:46

Это хорошо сработало для .doc и .odt.

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

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

openoffice и libreoffice плохо справляются с форматами MS.

Tedo Vrbanec 31.03.2019 21:42

тика-питон

Порт Python библиотеки Apache Tika. Согласно документации, Apache tika поддерживает извлечение текста из более чем 1500 форматов файлов.

Примечание: Также прекрасно работает с pyinstaller

Установить с помощью pip:

pip install tika

Образец:

#!/usr/bin/env python
from tika import parser
parsed = parser.from_file('/path/to/file')
print(parsed["metadata"]) #To get the meta data of the file
print(parsed["content"]) # To get the content of the file

Ссылка на официальный GitHub

Я пробовал ваш пример, и кажется, что он пытается загрузить и запустить файл Java .jar: "Retrieving search.maven.org/remotecontent?filepath=org/apache/tika/…" <- но затем он терпит неудачу с HTTP 403.

Prof. Falken 21.08.2018 18:02

Выполните следующие действия. 1. Вы можете вручную загрузить tika из здесь 2. Затем откройте tika.py из папки \ Lib \ site-packages \ tika и замените TikaJarPath = os.getenv ('TIKA_PATH', "path \ to \ tika-server. jar \ folder ") TikaJarPath = os.getenv('TIKA_PATH', "F:\Projects\python\tika")

Dhinesh kumar M 31.08.2018 16:03

Честно говоря, не используйте "pip install tika" ", это было разработано для монопользователя (один разработчик работает на своем ноутбуке), а не для многопользовательских (многопользовательских).

Небольшой класс TikaWrapper.py ниже, который использует Tika в командной строке, достаточно широко, чтобы удовлетворить наши потребности.

Вам просто нужно создать экземпляр этого класса с помощью пути JAVA_HOME и пути к банке Tika, вот и все! И он отлично работает со многими форматами (например, PDF, DOCX, ODT, XLSX, PPT и т. д.).

#!/bin/python
# -*- coding: utf-8 -*-

# Class to extract metadata and text from different file types (such as PPT, XLS, and PDF)
# Developed by Philippe ROSSIGNOL
#####################
# TikaWrapper class #
#####################
class TikaWrapper:

    java_home = None
    tikalib_path = None

    # Constructor
    def __init__(self, java_home, tikalib_path):
        self.java_home = java_home
        self.tika_lib_path = tikalib_path

    def extractMetadata(self, filePath, encoding = "UTF-8", returnTuple=False):
        '''
        - Description:
          Extract metadata from a document
        
        - Params:
          filePath: The document file path
          encoding: The encoding (default = "UTF-8")
          returnTuple: If True return a tuple which contains both the output and the error (default = False)
        
        - Examples:
          metadata = extractMetadata(filePath = "MyDocument.docx")
          metadata, error = extractMetadata(filePath = "MyDocument.docx", encoding = "UTF-8", returnTuple=True)
        '''
        cmd = self._getCmd(self._cmdExtractMetadata, filePath, encoding)
        out, err = self._execute(cmd, encoding)
        if (returnTuple): return out, err
        return out

    def extractText(self, filePath, encoding = "UTF-8", returnTuple=False):
        '''
        - Description:
          Extract text from a document
        
        - Params:
          filePath: The document file path
          encoding: The encoding (default = "UTF-8")
          returnTuple: If True return a tuple which contains both the output and the error (default = False)
        
        - Examples:
          text = extractText(filePath = "MyDocument.docx")
          text, error = extractText(filePath = "MyDocument.docx", encoding = "UTF-8", returnTuple=True)
        '''
        cmd = self._getCmd(self._cmdExtractText, filePath, encoding)
        out, err = self._execute(cmd, encoding)
        return out, err

    # ===========
    # = PRIVATE =
    # ===========

    _cmdExtractMetadata = "${JAVA_HOME}/bin/java -jar ${TIKALIB_PATH} --metadata ${FILE_PATH}"
    _cmdExtractText = "${JAVA_HOME}/bin/java -jar ${TIKALIB_PATH} --encoding=${ENCODING} --text ${FILE_PATH}"

    def _getCmd(self, cmdModel, filePath, encoding):
        cmd = cmdModel.replace("${JAVA_HOME}", self.java_home)
        cmd = cmd.replace("${TIKALIB_PATH}", self.tika_lib_path)
        cmd = cmd.replace("${ENCODING}", encoding)
        cmd = cmd.replace("${FILE_PATH}", filePath)
        return cmd

    def _execute(self, cmd, encoding):
        import subprocess
        process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = process.communicate()
        out = out.decode(encoding=encoding)
        err = err.decode(encoding=encoding)
        return out, err

На всякий случай, если кто-то хочет сделать на языке Java, есть Apache poi api. extractor.getText () извлечет плоский текст из docx. Вот ссылка https://www.tutorialspoint.com/apache_poi_word/apache_poi_word_text_extraction.htm

Другие вопросы по теме