2008-09-22 26 views
43

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 en una búsqueda dentro de Word.¿Cómo puedo buscar una palabra en un archivo .docx de Word 2007?

¿Hay alguna manera desde Python para ver el texto? No me interesa el formato, solo quiero clasificar los documentos como que tienen o no tienen "alguna frase especial".

Respuesta

32

Más exactamente, un documento .docx es un archivo Zip en formato OpenXML: primero tiene 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. La carpeta palabra contiene el documento en sí, en el archivo document.xml.

+0

Ya tengo todo el xml file.Now i Quiero preguntarle ¿Cómo podemos obtener todos los valores (negrita, cursiva, color, nombre de letra, espacio) y toda la configuración de formato? ¿Cómo podemos obtener estos valores de xml? – user1006544

4

A docx es solo un archivo zip con muchos archivos dentro. ¿Tal vez pueda ver algunos de los contenidos de esos archivos? Aparte de eso es probable que tenga que encontrar un lib que entiende el formato de la palabra para que pueda filtrar las cosas que no le interesan.

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

2

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

0

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

1

Automatización OLE probablemente sería la más fácil. Usted tiene que considerar el formato, ya que el texto podría tener este aspecto en el XML:

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

No hay manera fácil de encontrar que el uso de un análisis de texto simple.

16

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, que acaba de abrir el archivo docx (que es un archivo zip) usando zipfile, y encontrar el contenido en el archivo 'document.xml' en la carpeta 'palabra'. Si quieres ser más sofisticado, puedes llamar al parse the XML, pero si solo buscas una frase (que sabes que no será una etiqueta), puedes buscar en el XML la cadena.

+2

Probablemente sea más fácil buscar la frase en el texto del elemento (usando un analizador XML) que tener que preocuparse acerca de si parte de su texto coincide con un nombre de elemento. – mikemaccana

14

Un problema de buscar dentro de un archivo de documento XML palabra es que el texto se puede dividir en elementos en cualquier carácter. Ciertamente se dividirá si el formateo 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 de esta manera, 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 lo que será en Python) y pedir para obtener sólo texto como una cadena, pero que podría 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 espera. Entonces podrías terminar escribiendo tu propia biblioteca de procesamiento de documentos.

O puede intentar con Aspose.Words.

Está disponible como productos .NET y Java. Ambos se pueden usar desde Python. Uno vía COM Interop otro a través de JPype. Consulte la Guía de programadores de Aspose.Words, utilice Aspose.Words en otros lenguajes de programación (lo siento, no puedo publicar un segundo enlace, stackoverflow aún no me lo permite).

+1

'La especificación OOXML es de alrededor de 6000 páginas de largo': Debe estar bromeando: O – claws

140

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

+11

Espera ... ¿Escribió un módulo completo solo para esta pregunta? – 11684

+4

@ 11684 Sí, tuve el mismo problema que el póster, y todo lo que pude solucionar fueron soluciones horribles para invocar .net o Java desde Python. – mikemaccana

+0

Bueno, ya he votado su pregunta ... – 11684

4

Puede utilizar docx2txt para obtener el texto en el interior del docx, que la búsqueda en ese txt

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