Python可以利用 python-docx 模块处理word文档,处理方式是面向对象的。也就是说 python-docx 模块会把word文档,文档中的段落、文本、字体等都看做对象,对对象进行处理就是对word文档的内容处理。
标签简介
<w:p> 表示一个段落
<w:r> 表示一个样式串,指明它包括的文本的显示样式
<w:t> 表示真正的文本内容
<w:sectPr> 页面设置
<w:tbl> 表格
<w:br w:type="textWrapping"/> 换行
单独获取段落、换行、图片等;以及获取表格
#!/usr/bin/python3
import docx
doc = docx.Document('C:\\Users\\Administrator\\Desktop\\化学2页.docx')
# # 获取所有内容
print(doc._element.xml)
# # 遍历文档中的段落、换行、图片等
for para in doc.paragraphs:
# 打印段落文本
print(para.text)
# 打印段落xml
print(para._p.xml)
# # 遍历文档中的表格
for table in doc.tables:
#整个table xml
print(table._element.xml)
# 遍历表格中的行
for row in table.rows:
# 遍历行中的单元格
for cell in row.cells:
# 打印单元格文本
print(cell.text)
print(para._p.xml)
顺序获取word内容
import os
import docx
from docx.document import Document
from docx.oxml.table import CT_Tbl
from docx.oxml.text.paragraph import CT_P
from docx.table import _Cell, Table
from docx.text.paragraph import Paragraph
def iter_block_items(parent):
"""
按文档顺序给出*parent*中的每个段落和表子级。
每个返回值都是表或段落的一个实例。*parent* 最常见的是对主Document对象的引用,但是也适用于_Cell对象,它本身可以包含段落和表格。
"""
if isinstance(parent, Document):
parent_elm = parent.element.body
elif isinstance(parent, _Cell):
parent_elm = parent._tc
else:
raise ValueError("something's not right")
for child in parent_elm.iterchildren():
if isinstance(child, CT_P):
yield Paragraph(child, parent)
elif isinstance(child, CT_Tbl):
yield Table(child, parent)
def read_table(table):
# 打印 table 所有内容
# return [[cell.text for cell in row.cells] for row in table.rows]
# print(table._element.xml)
# 打印 table 子项
for row in table.rows:
# 打印行
for cell in row.cells:
# 打印单元格
print(cell.text)
# print(cell._element.xml)
#读取方法
def read_word(word_path):
doc = docx.Document(word_path)
for block in iter_block_items(doc):
if isinstance(block, Paragraph): #行
print("text:", block.text)
elif isinstance(block, Table): #表格
print("table:", read_table(block))
if __name__ == '__main__':
ROOT_DIR_P = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) # 项目根目录
word_path = os.path.join(ROOT_DIR_P, "D:\\item-py\\docx\\133.docx") # pdf文件路径及文件名
read_word(word_path)
print("end")