Есть ли разумный способ извлечь простой текст из файла Word, не зависящий от автоматизации COM? (Это функция для веб-приложения, развернутого на платформе, отличной от Windows - в данном случае это не подлежит обсуждению.)
Antiword кажется разумным вариантом, но, похоже, от него можно отказаться.
Решение Python было бы идеальным, но, похоже, недоступно.
Открытый офис имеет 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.
Для файлов 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 с помощью вашей библиотеки? Ваше здоровье
@mikemaccana может ли он также анализировать файлы .doc (не .docx)?
О файлах .doc спрашивайте как отдельный вопрос.
Если все, что вам нужно, - это извлекать текст из файлов 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)
Отличный код! Небольшое замечание о вашем блоге, если бы фон кода не был черным, он был бы более читабельным.
О, спасибо за комментарий. Проблема в том, что я немного «взломал» Github CSS, чтобы цвета соответствовали моему сайту. Но когда Github вносит изменения в свой CSS, мне приходится снова исправлять мою таблицу стилей, как сейчас. Не уверен, что сохраню этот подход ...
Это хорошо сработало для .doc и .odt.
Он вызывает openoffice в командной строке для преобразования файла в текст, который затем можно просто загрузить в python.
(Кажется, есть другие варианты формата, хотя они явно не задокументированы.)
openoffice и libreoffice плохо справляются с форматами MS.
тика-питон
Порт 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.
Выполните следующие действия. 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")
Честно говоря, не используйте "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
Обратите внимание, что python 3 удаляет popen3, см. docs.python.org/3/library/…