Question

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

Existe-t-il un moyen de voir le texte depuis Python? Le formatage ne m'intéresse pas - je souhaite simplement classer les documents comme ayant ou non une "phrase spéciale".

Était-ce utile?

La solution

Plus précisément, un document .docx est une archive Zip au format OpenXML: vous devez d'abord le décompresser.
J'ai téléchargé un échantillon (Google: certains termes de recherche filetype: docx ) et après avoir décompressé le fichier, j'ai trouvé des dossiers. Le dossier word contient le document lui-même, dans le fichier document.xml .

Autres conseils

Après avoir lu votre message ci-dessus, j'ai créé un module 100% Python docx natif 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 se trouve à l'adresse https://python-docx.readthedocs.org/en/ dernier /

Dans cet exemple, " Course Outline.docx " est un document Word 2007 qui contient le mot "Windows" et ne contient pas la phrase "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()

En gros, vous ouvrez simplement le fichier docx (qui est une archive zip) en utilisant zipfile et recherchez le contenu dans le fichier 'document.xml' du dossier 'word'. Si vous souhaitez être plus sophistiqué, vous pouvez alors analyser le code XML , mais si vous cherchez simplement une phrase (qui, vous le savez, ne sera pas une balise), vous pouvez simplement chercher la chaîne dans le code XML.

Un problème avec la recherche dans un fichier XML de document Word est que le texte peut être scindé en éléments à n’importe quel caractère. Si le formatage est différent, il sera certainement scindé, par exemple dans Hello Monde . Mais il peut être divisé à tout moment, ce qui est valable dans OOXML. Vous finirez donc par avoir affaire à XML comme ceci 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 cela sera en Python) et demander à obtenir du texte uniquement sous forme de chaîne, mais vous pourriez vous retrouver avec de nombreux autres "impasses". simplement parce que la spécification OOXML fait environ 6000 pages et que MS Word peut écrire beaucoup de "choses". vous ne vous attendez pas. Vous pourriez donc finir par écrire votre propre bibliothèque de traitement de documents.

Ou vous pouvez essayer d'utiliser Aspose Mots .

Il est disponible en tant que produits .NET et Java. Les deux peuvent être utilisés à partir de Python. Un via COM Interop autre via JPype. Consultez le Guide du programmeur Aspose.Words, Utilisation de Aspose.Words dans d’autres langages de programmation (désolé, je ne peux pas publier un deuxième lien, stackoverflow ne me le permet pas encore).

Un docx n’est qu’une archive zip contenant de nombreux fichiers. Peut-être que vous pouvez regarder une partie du contenu de ces fichiers? Sinon, vous devrez probablement trouver une bibliothèque comprenant le format de mot pour pouvoir filtrer les éléments qui ne vous intéressent pas.

Un deuxième choix serait d’interopérer avec Word et d’effectuer la recherche à travers celui-ci.

Vous pouvez utiliser docx2txt pour obtenir le texte dans le docx, puis effectuez une recherche dans ce texte

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

un fichier docx est essentiellement un fichier zip contenant un xml.
le XML contient la mise en forme, mais il contient également le texte.

L’automatisation OLE serait probablement la plus simple. Vous devez envisager le formatage, 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 un simple balayage de texte.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top