Pregunta

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

¿Hay alguna forma desde Python de ver el texto?No tengo ningún interés en formatear; solo quiero clasificar los documentos según tengan o no "alguna frase especial".

¿Fue útil?

Solución

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

Otros consejos

Después de leer tu publicación anterior, creé un módulo docx de 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/

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, simplemente abre el archivo docx (que es un archivo zip) usando archivo zip, y busque el contenido en el archivo 'document.xml' en la carpeta 'word'.Si quisieras 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), entonces puedes buscar la cadena en el XML.

Un problema al buscar dentro de un archivo XML de un documento de Word es que el texto se puede dividir en elementos de cualquier carácter.Seguramente se dividirá si el formato es diferente, por ejemplo como en Hola Mundo.Pero poder dividirse en cualquier punto y que sea válido en OOXML.¡Así que terminarás tratando con XML como este incluso si el formato no cambia en 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 qué 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á disponible. Tiene 6000 páginas y MS Word puede escribir muchas "cosas" que no esperas.Entonces 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 utilizar desde Python.Uno vía COM Interop y otro vía JPype.Consulte la Guía para programadores de Aspose.Words, Utilice Aspose.Words en otros lenguajes de programación (lo siento, no puedo publicar un segundo enlace, stackoverflow todavía no me lo permite).

Un docx es sólo un archivo zip con muchos archivos en su interior.¿Quizás puedas ver algunos de los contenidos de esos archivos?Aparte de eso, probablemente tengas que encontrar una biblioteca que comprenda el formato de palabras para poder filtrar las cosas que no te interesan.

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

Puedes 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

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

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

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

No existe una manera fácil de encontrarlo mediante un simple escaneo de texto.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top