¿Cómo puedo buscar una palabra en un archivo .docx de Word 2007?

Me gustaría buscar un archivo de Word 2007 (.docx) para una cadena de texto, por ejemplo, “alguna frase especial” que podría / podría encontrarse en una búsqueda dentro de Word.

¿Hay una manera de Python para ver el texto? No me interesa el formateo, solo quiero clasificar los documentos como que tienen o no tienen “alguna frase especial”.

Más exactamente, un documento .docx es un archivo Zip en formato OpenXML: primero debe descomprimirlo.
Descargué una muestra (Google: un término de búsqueda tipo de archivo: docx ) y después de descomprimir encontré algunas carpetas. La carpeta de palabras contiene el documento en sí, en el archivo document.xml .

Después de leer tu publicación anterior, hice un módulo 100% nativo de Python docx para resolver este problema específico.

# Import the module from docx import * # Open the .docx file document = opendocx('A document.docx') # Search returns true if found search(document,'your search string') 

El módulo docx se encuentra en https://python-docx.readthedocs.org/en/latest/

En este ejemplo, “Course Outline.docx” es un documento de Word 2007, que contiene la palabra “Windows” y no contiene la frase “otra cadena aleatoria”.

 >>> import zipfile >>> z = zipfile.ZipFile("Course Outline.docx") >>> "Windows" in z.read("word/document.xml") True >>> "random other string" in z.read("word/document.xml") False >>> z.close() 

Básicamente, solo abre el archivo docx (que es un archivo zip) usando zipfile y encuentra el contenido en el archivo ‘document.xml’ en la carpeta ‘word’. Si quisiera ser más sofisticado, podría analizar el XML , pero si solo está buscando una frase (que sabe que no será una etiqueta), puede buscar la cadena en el XML.

Un problema con la búsqueda dentro de un archivo XML de documento de Word es que el texto se puede dividir en elementos en cualquier carácter. Sin duda, se dividirá si el formato es diferente, por ejemplo, como en Hello World . Pero se puede dividir en cualquier punto y eso es válido en OOXML. Por lo tanto, ¡terminará tratando con XML de esta manera incluso si el formato no cambia en el medio de la frase!

      Hello   World.   

Por supuesto, puede cargarlo en un árbol de DOM XML (no está seguro de lo que será en Python) y solicitar obtener texto solo como una cadena, pero podría terminar con muchos otros “callejones sin salida” solo porque la especificación OOXML está alrededor 6000 páginas y MS Word puede escribir muchas “cosas” que no esperas. Así que podrías terminar escribiendo tu propia biblioteca de procesamiento de documentos.

O puedes intentar usar Aspose.Words .

Está disponible como productos .NET y Java. Ambos pueden ser usados ​​desde Python. Uno a través de COM Interop otro a través de JPype. Consulte la Guía de progtwigdores de Aspose.Words, Utilice Aspose.Words en otros lenguajes de progtwigción (lo siento, no puedo publicar un segundo enlace, stackoverflow no me deja todavía).

Un docx es solo un archivo zip con muchos archivos dentro. Tal vez usted puede mirar algunos de los contenidos de esos archivos? Aparte de eso, es probable que tenga que encontrar una biblioteca que entienda el formato de palabra para poder filtrar las cosas que no le interesan.

Una segunda opción sería interoperar con la palabra y hacer la búsqueda a través de ella.

Puede usar docx2txt para obtener el texto dentro de docx, que buscar en ese txt

 npm install -g docx2txt docx2txt input.docx # This will print the text to stdout 

un archivo docx es esencialmente un archivo zip con un xml dentro de él.
el xml contiene el formato pero también contiene el texto.

La automatización OLE probablemente sería la más fácil. Debes considerar el formato, porque el texto podría verse así en el XML:

 Looking for this phrase 

No hay una manera fácil de encontrarlo utilizando un simple escaneo de texto.

Debería poder usar la interfaz ActiveX de MSWord para extraer el texto a buscar (o, posiblemente, hacer la búsqueda). Sin embargo, no tengo idea de cómo accedes a ActiveX desde Python.

También puede considerar utilizar la biblioteca de OpenXMLDeveloper.org