Pergunta

Gostaria de pesquisar em um arquivo do Word 2007 (.docx) uma string de texto, por exemplo, "alguma frase especial" que poderia/seria encontrada em uma pesquisa no Word.

Existe uma maneira do Python ver o texto?Não tenho interesse em formatação - só quero classificar os documentos como tendo ou não "alguma frase especial".

Foi útil?

Solução

Mais exatamente, um documento .docx é um arquivo zip no formato OpenXML: você deve primeiro descomputá -lo.
Eu baixei uma amostra (Google: Alguns Termo de Pesquisa Filetype: Docx) e depois de descompactar, encontrei algumas pastas. o palavra Pasta contém o próprio documento, no arquivo document.xml.

Outras dicas

Depois de ler sua postagem acima, fiz um módulo Python DOCX 100% nativo para resolver esse 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')

O módulo DOCX está em https://python-docx.readthedocs.org/en/latest/

Neste exemplo, "curso de curso.docx" é um documento do Word 2007, que contém a palavra "Windows", e não contém a frase "outra string aleatória".

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

Basicamente, você acabou de abrir o arquivo docx (que é um arquivo zip) usando ZipFile, e encontre o conteúdo na pasta 'document.xml' na pasta 'word'. Se você quisesse ser mais sofisticado, você poderia então analise o xml, mas se você está apenas procurando uma frase (que você sabe que não será uma tag), poderá procurar no XML para a string.

Um problema com a pesquisa dentro de um arquivo XML de documento do Word é que o texto pode ser dividido em elementos com qualquer caractere.Certamente será dividido se a formatação for diferente, por exemplo como em Hello Mundo.Mas isso pode ser dividido a qualquer momento e isso é válido em OOXML.Então você vai acabar lidando com XML assim mesmo que a formatação não mude no meio da 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>

É claro que você pode carregá-lo em uma árvore XML DOM (não tenho certeza do que será no Python) e pedir para obter o texto apenas como uma string, mas você pode acabar com muitos outros "becos sem saída" só porque a especificação OOXML está por aí 6.000 páginas e o MS Word pode escrever muitas "coisas" que você não espera.Então você pode acabar escrevendo sua própria biblioteca de processamento de documentos.

Ou você pode tentar usar Aspor.Palavras.

Ele está disponível como produtos .NET e Java.Ambos podem ser usados ​​em Python.Um via COM Interop outro via JPype.Consulte Aspose.Words Programmers Guide, Utilize Aspose.Words em outras linguagens de programação (desculpe, não posso postar um segundo link, o stackoverflow ainda não permite).

Um DOCX é apenas um arquivo zip com muitos arquivos dentro. Talvez você possa olhar para alguns dos conteúdos desses arquivos? Fora isso, você provavelmente precisa encontrar um LIB que entenda o formato da palavra para que você possa filtrar as coisas em que não está interessado.

Uma segunda opção seria interover o Word e fazer a pesquisa nela.

Você pode usar docx2txt Para colocar o texto dentro do docx, do que pesquisar naquele txt

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

Um arquivo DOCX é essencialmente um arquivo zip com um XML dentro dele.
O XML contém a formatação, mas também contém o texto.

A automação OLE provavelmente seria a mais fácil. Você deve considerar a formatação, porque o texto pode ser assim no XML:

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

Não há maneira fácil de descobrir isso usando uma simples varredura de texto.

Você deve usar a interface MSWord ActiveX para extrair o texto para pesquisar (ou, possivelmente, fazer a pesquisa). Eu não tenho ideia de como você acessa ActiveX do Python.

Você também pode considerar usar a biblioteca de Openxmldeveloper.org

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top