Acerca del análisis de docx con python

El trabajo reciente implica analizar docx. He analizado muchos métodos, utilizando C ++, Java y Python. Finalmente, descubrí que la practicidad, incluida la simplicidad, todavía necesita Python y no se puede ejecutar. Luego miré muchas bibliotecas docx de análisis de Python y finalmente elegí usar python-docx. Por supuesto, muchos tutoriales también tratan sobre cómo usar python-docx para el análisis de documentos de Word, pero si usamos las funciones básicas de python-docx, como:

Impresión de párrafos:

from docx import Document
from docx.shared import Inches

document = Document('demo.docx')  #打开文件
for paragraph in document.paragraphs:
    print(paragraph.text)  #打印各段落内容文本

O extracción de mesa:

import docx
from docx import Document #导入库

path = 'demo.docx' #文件路径
document = Document(path) #读入文件
tables = document.tables #获取文件中的表格集

for table in tables[:]:
    for i, row in enumerate(table.rows[:]):   # 读每行
        row_content = []
        for cell in row.cells[:]:  # 读一行中的所有单元格
            c = cell.text
            row_content.append(c)
        print (row_content) #以列表形式导出每一行数据

Al usar este método para leer, solo podemos leer la información de texto más básica de cada parte y no podemos leer y analizar algunos caracteres especiales.

Por ejemplo , los símbolos como: no se pueden analizar de esta manera, pero son necesarios. En este momento, debemos cambiar nuestra forma de pensar y usar OPENXML para el análisis de palabras.

De hecho, si desea saber acerca de openxml, simplemente cambie el sufijo del archivo docx a zip y descomprímalo, y verá que el archivo completo está dividido en muchos archivos xml, que almacenan el contenido y formato del documento. Abra document.xml y verá el contenido de nuestro cuerpo. Arriba.

Entre ellos, document.xml también sigue la estructura de datos xml, incluidas etiquetas, atributos, etc. Entonces, lo que tenemos que hacer es encontrar la etiqueta que representa el símbolo especial y restaurarla a la posición correspondiente en el texto original.

Entonces, la razón para elegir python-docx aquí es que puede restaurar su estructura openxml mientras lee docx.Podemos usar directamente xml para buscar etiquetas.

Primero, comprendamos primero el formato de openxml, consulte https://blog.csdn.net/liuqixuan1994/article/details/104486600/ :

Estructura general: cuerpo, estilos, escenarios, etc.

Nodo de párrafo:<w:p>

Unidad de formato básico Ejecutar nodo:<w:r>

Nodo Propiedades de formato: <w:pPr>y<w:rPr>

Fuente<w:rFonts>

Tamaño de fuente <w:sz>,<w:szCs>

Texto que puede ver:<w:t>

Entre ellos, necesitamos analizar la representación de caracteres especiales en el archivo xml. He encontrado alrededor de tres tipos, uno es

Por esta razón, podemos buscar directamente las etiquetas correspondientes en xml para encontrar caracteres especiales.

Primero, leemos el documento y lo abrimos en XML, buscamos la etiqueta w: r, la unidad de párrafo básica:

from docx import Document
from lxml import etree

doc = Document('demo.docx')
body_xml_str = doc._body._element.xml # 获取body中的xml
body_xml = etree.fromstring(body_xml_str) # 转换成lxml结点
print(etree.tounicode(body_xml)) # 打印查看

for p in doc.paragraphs:
    p_xml_str = p._p.xml # 按段落获取xml
    p_xml = etree.fromstring(p_xml_str) # 转换成lxml结点
    print(etree.tounicode(p_xml)) # 打印查看
    xml_dom = parseString(etree.tounicode(p_xml))
    stus = xml_dom.getElementsByTagName('w:r')
    for si in stus:
        print(si)

Extrae caracteres especiales en párrafos:

sym_id = si.getElementsByTagName('w:sym')
    for sym_i in sym_id:
        if((sym_i.attributes._attrs['w:font'].nodeValue=='Wingdings2')and(sym_i.attributes._attrs['w:char'].nodeValue=='0052')):
            print('特殊字符',end='')
    
sym_box = si.getElementsByTagName('w:instrText')
for box_i in sym_box:
    if((box_i.childNodes[0].data == 'FORMCHECKBOX'):
        print('特殊字符',end='')

sym_box = si.getElementsByTagName('w:checked')
for box_i in sym_box:
    print('特殊字符',end='')

De esta manera, se pueden encontrar los caracteres especiales. Por supuesto, debe encontrar la representación correspondiente para una coincidencia específica en escenarios específicos.

Supongo que te gusta

Origin blog.csdn.net/wi162yyxq/article/details/108431881
Recomendado
Clasificación