COMO LER DOCUMENTOS DO WORD COM PYTHON

COMO LER DOCUMENTOS DO WORD COM PYTHON

Compartilhe!

Esta postagem vai falar sobre como ler documentos do Word com Python. Vamos cobrir três pacotes diferentes – docx2txt , docx e meu favorito pessoal: docx2python .

O pacote docx2txt

Vamos falar sobre docx2text primeiro. Este é um pacote Python que permite copiar texto e imagens de documentos do Word. O exemplo abaixo é lido em um documento do Word contendo o Zen do Python . Como você pode ver, depois de importar o docx2txt , tudo o que precisamos é de uma linha de código para ler o texto do documento do Word. Podemos ler o documento usando um método no pacote chamado processo , que leva o nome do arquivo como entrada. Texto normal, itens listados, texto de hiperlink e texto de tabela serão todos retornados em uma única string.

import docx2txt
 
# read in word file
result = docx2txt.process("zen_of_python.docx")
python scrape word document


E se o arquivo tiver imagens? Nesse caso, precisamos apenas de um pequeno ajuste em nosso código. Quando executamos o método de processo , podemos passar um parâmetro extra que especifica o nome de um diretório de saída. A execução de docx2txt.process extrairá todas as imagens do documento do Word e as salvará nesta pasta especificada. O texto do arquivo também será extraído e armazenado na variável de resultado .

import docx2txt
 
result = docx2txt.process("zen_of_python_with_image.docx", "C:/path/to/store/files")

Imagem de amostra

python extrair imagem de documento do Word


docx2txt também irá raspar qualquer texto das tabelas. Novamente, isso será retornado em uma única string com qualquer outro texto encontrado no documento, o que significa que esse texto pode ser mais difícil de analisar. Posteriormente neste post, falaremos sobre docx2python , que permite a você raspar tabelas em um formato mais estruturado.

O pacote docx

O código-fonte por trás do docx2txt é derivado do código no pacote docx , que também pode ser usado para copiar documentos do Word. docx é uma biblioteca poderosa para manipular e criar documentos do Word, mas também pode (com algumas restrições) ler texto de arquivos do Word.

No exemplo abaixo, abrimos uma conexão com nosso arquivo de palavras de amostra usando o método docx.Document . Aqui, apenas inserimos o nome do arquivo ao qual queremos nos conectar. Então, podemos raspar o texto de cada parágrafo no arquivo usando uma compreensão de lista em conjunto com doc.paragraphs . Isso incluirá a eliminação de linhas separadas definidas no documento do Word para os itens listados. Ao contrário do docx2txt , o docx não pode copiar imagens de documentos do Word. Além disso, o docx não raspará hiperlinks e texto em tabelas definidas no documento do Word.

import docx
 
# open connection to Word Document
doc = docx.Document("zen_of_python.docx")
 
# read in each paragraph in file
result = [p.text for p in doc.paragraphs]
python docx

O pacote docx2python

docx2python é outro pacote que podemos usar para copiar documentos do Word. Ele possui alguns recursos adicionais além de docx2txt e docx . Por exemplo, é capaz de retornar o texto extraído de um documento em um formato mais estruturado. Vamos testar nosso documento do Word com docx2python . Vamos adicionar uma tabela simples no documento para que possamos extraí-la também (veja abaixo).

python word document table

docx2python contém um método com o mesmo nome. Se chamarmos este método com o nome do documento como entrada, obtemos de volta um objeto com vários atributos.

from docx2python import docx2python
 
# extract docx content
doc_result = docx2python('zen_of_python.docx')

Cada atributo fornece texto ou informações do arquivo. Por exemplo, considere que nosso arquivo tem três componentes principais – o texto contendo o Zen do Python, uma mesa e uma imagem. Se chamarmos doc_result.body , cada um desses componentes será retornado como itens separados em uma lista .

# get separate components of the document
doc_result.body
 
# get the text from Zen of Python
doc_result[0]
 
# get the image
doc_result[1] 
 
# get the table text
doc_result[2]

Raspagem de uma tabela de documento do Word com docx2python

O resultado do texto da tabela é retornado como uma lista aninhada, como você pode ver abaixo. Cada linha (incluindo o cabeçalho) é retornada como uma sub-lista separada. O 0º elemento da lista refere-se ao cabeçalho – ou 0ª linha da tabela. O próximo elemento se refere à próxima linha na tabela e assim por diante. Por sua vez, cada valor em uma linha é retornado como uma sub-lista individual dentro da lista correspondente dessa linha.

mesa de raspagem docx2python

Podemos converter este resultado em um formato tabular usando o pandas . O quadro de dados ainda está um pouco confuso – cada célula no quadro de dados é uma lista contendo um único valor. Este valor também tem alguns “\ t” ‘s (que representam espaços de tabulação).

pd.DataFrame(doc_result.body[1][1:])
python raspar tabela de arquivo de palavra

Aqui, usamos o método applymap para aplicar a função lambda abaixo a cada célula no quadro de dados. Esta função obtém o valor individual dentro da lista em cada célula e remove todas as instâncias de “\ t”.

import pandas as pd 
pd.DataFrame(doc_result.body[1][1:]).\
                            applymap(lambda val: val[0].strip("\t"))
quadro de dados docx2python pandas

A seguir, vamos alterar os cabeçalhos das colunas para o que vemos no arquivo do Word (que também foi retornado para nós em doc_result.body ).

df.columns = [val[0].strip("\t") for val in doc_result.body[1][0]]
docx2python raspar tabela de documento do Word

Extraindo imagens

Podemos extrair as imagens do arquivo Word usando o atributo images do nosso objeto doc_result . doc_result.images consiste em um dicionário onde as chaves são os nomes dos arquivos de imagem (não gravados automaticamente no disco) e os valores correspondentes são os arquivos de imagens em formato binário.

type(doc_result.images) # dict
 
doc_result.images.keys() # dict_keys(['image1.png'])

Podemos gravar a imagem formatada em binário em um arquivo físico como este:

for key,val in doc_result.images.items():
    f = open(key, "wb")
    f.write(val)
    f.close()

Acima, estamos apenas fazendo um loop pelas chaves (nomes de arquivos de imagem) e valores (imagens binárias) no dicionário e escrevendo cada um para o arquivo. Nesse caso, temos apenas uma imagem no documento, então apenas escrevemos uma.

Outros atributos

O resultado docx2python tem vários outros atributos que podemos usar para extrair texto ou informações do arquivo. Por exemplo, se quisermos apenas obter todo o texto do arquivo em uma única string (semelhante a docx2txt ), podemos executar doc_result.text .

# get all text in a single string
doc_result.text

Além do texto, também podemos obter metadados sobre o arquivo usando o atributo properties . Isso retorna informações como o criador do documento, as datas de criação / última modificação e o número de revisões.

doc_result.properties

Se o documento que você está copiando tem cabeçalhos e rodapés, você também pode raspar assim (observe a versão singular de “cabeçalho” e “rodapé”):

# get the headers
doc_result.header
 
# get the footers
doc_result.footer

As notas de rodapé também podem ser extraídas assim:

doc_result.footnotes

Obter HTML devolvido com docx2python

Também podemos especificar que queremos um objeto HTML retornado com o método docx2python que suporta alguns tipos de tags, incluindo fonte (tamanho e cor), itálico, negrito e texto sublinhado. Precisamos apenas especificar o parâmetro “html = True”. No exemplo abaixo, vemos O Zen do Python em negrito e sublinhado. Correspondendo a isso, podemos ver a versão HTML disso no segundo instantâneo abaixo. O recurso HTML atualmente não oferece suporte a tags relacionadas a tabelas, então eu recomendaria usar o método que vimos acima se você estiver procurando raspar tabelas de documentos do Word.

doc_html_result = docx2python('zen_of_python.docx', html = True)
python word document html
python obter html de documento do Word



Espero que tenha gostado deste post! Por favor, verifique outras postagens minhas sobre Python abaixo ou clicando aqui .

Compartilhe!