Domanda

Vorrei cercare un file Word 2007 (.docx) per una stringa di testo, ad es. " qualche frase speciale " che potrebbe / sarebbe trovato da una ricerca all'interno di Word.

C'è un modo da Python per vedere il testo? Non ho alcun interesse per la formattazione: voglio solo classificare i documenti come aventi o meno "qualche frase speciale".

È stato utile?

Soluzione

Più esattamente, un documento .docx è un archivio Zip in formato OpenXML: devi prima decomprimerlo.
Ho scaricato un esempio (Google: alcuni termini di ricerca tipo di file: docx ) e dopo aver decompresso ho trovato alcune cartelle. La cartella word contiene il documento stesso, nel file document.xml .

Altri suggerimenti

Dopo aver letto il tuo post sopra, ho creato un modulo docx Python nativo al 100% per risolvere questo specifico problema.

# 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')

Il modulo docx si trova a https://python-docx.readthedocs.org/en/ ultima /

In questo esempio, " Course Outline.docx " è un documento di Word 2007, che contiene la parola "Windows" e non contiene la frase "altra stringa casuale".

>>> 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()

In pratica, basta aprire il file docx (che è un archivio zip) usando zipfile e trova il contenuto nel file "document.xml" nella cartella "word". Se vuoi essere più sofisticato, puoi analizzare l'XML , ma se stai solo cercando una frase (che sai non sarà un tag), puoi semplicemente cercare la stringa nell'XML.

Un problema con la ricerca all'interno di un file XML di un documento Word è che il testo può essere diviso in elementi con qualsiasi carattere. Sarà certamente diviso se la formattazione è diversa, ad esempio come in Hello Mondo . Ma può essere diviso in qualsiasi momento e questo è valido in OOXML. Quindi finirai per gestire XML in questo modo anche se la formattazione non cambia nel mezzo della 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>

Ovviamente puoi caricarlo in un albero DOM XML (non sono sicuro di cosa sarà in Python) e chiedere di ottenere il testo solo come una stringa, ma potresti finire con molti altri "vicoli ciechi". solo perché le specifiche OOXML sono lunghe circa 6000 pagine e MS Word può scrivere un sacco di "cose" non ti aspetti. Quindi potresti finire per scrivere la tua libreria di elaborazione dei documenti.

Oppure puoi provare a utilizzare Aspose .Words .

È disponibile come prodotti .NET e Java. Entrambi possono essere usati da Python. Uno via COM Interopra l'altro via JPype. Consulta la Guida dei programmatori di Aspose.Words, Utilizza Aspose.Words in altri linguaggi di programmazione (mi dispiace non poter pubblicare un secondo link, stackoverflow non me lo consente ancora).

Un docx è solo un archivio zip con molti file all'interno. Forse puoi vedere alcuni dei contenuti di quei file? A parte questo, probabilmente dovrai trovare una libreria che comprenda il formato delle parole in modo da poter filtrare le cose che non ti interessano.

Una seconda scelta sarebbe quella di interagire con la parola e fare la ricerca attraverso di essa.

Puoi usare docx2txt per inserire il testo all'interno di docx, quindi cercare in quel txt

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

un file docx è essenzialmente un file zip con un xml al suo interno.
l'xml contiene la formattazione ma contiene anche il testo.

L'automazione OLE sarebbe probabilmente la più semplice. Devi considerare la formattazione, perché il testo potrebbe apparire così nell'XML:

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

Non esiste un modo semplice per trovarlo utilizzando una semplice scansione di testo.

Dovresti essere in grado di usare l'interfaccia ActiveX di MSWord per estrarre il testo da cercare (o, possibilmente, fare la ricerca). Non ho idea di come accedi ad ActiveX da Python.

Puoi anche prendere in considerazione l'uso della libreria da OpenXMLDeveloper.org

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top