python - read - ¿Cómo puedo buscar una palabra en un archivo.docx de Word 2007?
python docx template (10)
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.
¿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".
Automatización OLE probablemente sería la más fácil. Debe considerar formatear, 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.
Debería 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.
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/
En este ejemplo, "Course Outline.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, acaba de abrir el archivo docx (que es un archivo zip) usando zipfile , y encuentra el contenido en el archivo ''document.xml'' en la carpeta ''palabra''. 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 en el XML la cadena.
Más exactamente, un documento .docx es un archivo Zip en formato OpenXML: primero tiene que descomprimirlo.
Descargué una muestra (Google: algunos términos de búsqueda tipo de archivo: docx ) y después de descomprimir encontré algunas carpetas. La palabra carpeta contiene el documento en sí, en el archivo document.xml .
Puede usar docx2txt
para obtener el texto dentro del docx, que buscar en ese txt
npm install -g docx2txt
docx2txt input.docx # This will print the text to stdout
También puede considerar usar la biblioteca de OpenXMLDeveloper.org
Un docx es solo un archivo zip con muchos archivos dentro. ¿Tal vez pueda ver algunos de los contenidos de esos archivos? Aparte de eso, probablemente tenga que encontrar una lib que entienda el formato de la palabra para que pueda 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.
Un problema con la búsqueda dentro de un archivo XML de documento de Word es que el texto se puede dividir en elementos de cualquier carácter. Ciertamente se dividirá si el formateo es diferente, por ejemplo, como en Hello World . Pero se puede dividir 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 solicitar que el texto aparezca solo como una cadena, pero podría terminar con muchos otros "callejones sin salida" solo porque la especificación OOXML esté cerca. 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 usar 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, aún no me lo permite).
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.