¿Cómo puedo buscar una palabra en una Palabra 2007.archivo docx?


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

¿Hay alguna forma de que Python vea el texto? No tengo ningún interés en formatear-solo quiero clasificar los documentos como tener o no tener "alguna frase especial".

Author: edi9999, 2008-09-22

10 answers

Más exactamente, a .el documento docx es un archivo Zip en formato OpenXML: primero tiene que descomprimirlo.
He descargado una muestra (Google: algún término de búsqueda tipo de archivo:docx) y después de descomprimir encontré algunas carpetas. La carpeta word contiene el documento en sí, en archivo documento.xml .

 33
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-22 17:22:10

Después de leer su post anterior, hice un módulo Docx Python 100% nativo 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 está en https://python-docx.readthedocs.org/en/latest /

 145
Author: mikemaccana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-27 08:53:42

En este ejemplo, "Esquema del curso.docx " es un documento de Word 2007, que contiene la palabra "Windows", y no contiene la frase"random other string".

>>> 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 tienes que abrir el archivo docx (que es un archivo zip) usando zipfile, y encontrar el contenido en el 'documento.archivo xml 'en la carpeta 'word'. Si quieres ser más sofisticado, entonces podrías analizar el XML , pero si solo estás buscando una frase (que sabes que no será una etiqueta), a continuación, puede buscar la cadena en el XML.

 16
Author: Tony Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-22 23:12:59

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. Ciertamente se dividirá si el formato es diferente, por ejemplo, como en Hello World. Pero puede dividirse en cualquier punto y eso es válido en OOXML. ¡Así que terminarás lidiando con XML como este incluso si el formato no cambia en el medio de la frase!

<w:p w:rsidR="00C07F31" w:rsidRDefault="003F6D7A">

<w:r w:rsidRPr="003F6D7A">

<w:rPr>

<w:b /> 

</w:rPr>

<w:t>Hello</w:t> 

</w:r>

<w:r>

<w:t xml:space="preserve">World.</w:t> 

</w:r>

</w:p>

Por supuesto, puede cargarlo en un árbol DOM XML (no estoy seguro de en qué estará esto Python) y pide obtener texto solo como una cadena, pero podrías terminar con muchos otros "callejones sin salida" solo porque la especificación OOXML tiene alrededor de 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.Palabras.

Está disponible como productos.NET y Java. Ambos se pueden usar desde Python. Una vía COM Interop otra vía JPype. Ver Aspose.Guía de Programadores de Palabras, Utilizar Aspose.Palabras en Otros Lenguajes de programación (lo sentimos, no puedo publicar un segundo enlace, stackoverflow no me deja todavía).

 14
Author: romeok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-15 11:01:08

Un docx es solo un archivo zip con muchos archivos dentro. Tal vez usted puede ver algunos de los contenidos de esos archivos? Aparte de eso, probablemente tengas que encontrar una lib que entienda el formato de word para que puedas filtrar las cosas que no te interesan.

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

 4
Author: kokos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-22 17:16:43

Puede usar docx2txt para obtener el texto dentro del docx, luego buscar en ese txt

npm install -g docx2txt
docx2txt input.docx # This will  print the text to stdout
 4
Author: edi9999,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 10:51:23

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

 2
Author: shoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-22 17:17:15

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

<b>Looking <i>for</i> this <u>phrase</u>

No hay una manera fácil de encontrar eso usando un simple escaneo de texto.

 1
Author: ilitirit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-10 21:18:00

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.

 0
Author: Andy Brice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-22 17:17:26

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

 0
Author: billb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-18 19:34:32