web-dev-qa-db-fra.com

Comment puis-je rechercher un mot dans un fichier .docx Word 2007?

Je voudrais rechercher dans un fichier Word 2007 (.docx) une chaîne de texte, par exemple, "une phrase spéciale" qui pourrait/serait trouvée à partir d'une recherche dans Word.

Existe-t-il un moyen de Python pour voir le texte? Je n'ai aucun intérêt à mettre en forme - je veux juste classer les documents comme ayant ou non "une phrase spéciale".

47
Gerry

Plus exactement, un document .docx est une archive Zip au format OpenXML: vous devez d'abord le décompresser.
J'ai téléchargé un exemple (Google: n terme de recherche type de fichier: docx) et après avoir décompressé j'ai trouvé quelques dossiers. Le dossier Word contient le document lui-même, dans le fichier document.xml.

34
PhiLho

Après avoir lu votre article ci-dessus, j'ai créé un module docx 100% natif Python pour résoudre ce problème spécifique.

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

Le module docx est à https://python-docx.readthedocs.org/en/latest/

152
mikemaccana

Dans cet exemple, "Course Outline.docx" est un document Word 2007, qui contient le mot "Windows" et ne contient pas l'expression "autre chaîne aléatoire".

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

Fondamentalement, vous ouvrez simplement le fichier docx (qui est une archive Zip) en utilisant zipfile , et recherchez le contenu dans le fichier 'document.xml' dans le dossier 'Word'. Si vous vouliez être plus sophistiqué, vous pourriez alors analyser le XML , mais si vous cherchez juste une phrase (dont vous savez qu'elle ne sera pas une balise), alors vous pouvez simplement regarder dans le XML de la chaîne.

16
Tony Meyer

Un problème avec la recherche dans un fichier XML de document Word est que le texte peut être divisé en éléments à n'importe quel caractère. Il sera certainement divisé si le formatage est différent, par exemple comme dans Hello World . Mais il peut être divisé à tout moment et c'est valable dans OOXML. Vous finirez donc par traiter XML comme ça même si le formatage ne change pas au milieu de la phrase!

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

Vous pouvez bien sûr le charger dans une arborescence DOM XML (vous ne savez pas ce que ce sera en Python) et demander à obtenir le texte uniquement sous forme de chaîne, mais vous pourriez vous retrouver avec de nombreux autres "impasses" juste parce que la spécification OOXML est autour 6000 pages de long et MS Word peut écrire beaucoup de "trucs" auxquels vous ne vous attendez pas. Ainsi, vous pourriez finir par écrire votre propre bibliothèque de traitement de documents.

Ou vous pouvez essayer d'utiliser Aspose.Words .

Il est disponible en tant que .NET et Java. Les deux peuvent être utilisés à partir de Python. Un via COM Interopérez un autre via JPype. Voir le Guide des programmeurs Aspose.Words, Utiliser Aspose.Words dans d'autres langages de programmation ( désolé je ne peux pas poster un deuxième lien, stackoverflow ne me laisse pas encore).

14
romeok

Vous pouvez utiliser docx2txt pour obtenir le texte dans le docx, que rechercher dans ce txt

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

Un docx est juste une archive Zip avec beaucoup de fichiers à l'intérieur. Peut-être pouvez-vous consulter une partie du contenu de ces fichiers? En dehors de cela, vous devez probablement trouver une bibliothèque qui comprend le format Word afin que vous puissiez filtrer les choses qui ne vous intéressent pas.

Un deuxième choix serait d'interopérer avec Word et de faire une recherche à travers celui-ci.

4
kokos

un fichier docx est essentiellement un fichier Zip avec un xml à l'intérieur.
le xml contient le formatage mais il contient également le texte.

2
shoosh

OLE Automation serait probablement le plus simple. Vous devez considérer la mise en forme, car le texte pourrait ressembler à ceci dans le XML:

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

Il n'y a pas de moyen facile de trouver cela en utilisant une simple analyse de texte.

1
ilitirit

Vous pouvez également envisager d'utiliser la bibliothèque de OpenXMLDeveloper.org

0
billb

Vous devriez pouvoir utiliser l'interface MSWord ActiveX pour extraire le texte à rechercher (ou, éventuellement, faire la recherche). Je n'ai aucune idée de la façon dont vous accédez à ActiveX à partir de Python cependant.

0
Andy Brice