恭喜你,你已经学会了解析docx的文本了。
是的,提取一个docx的文本,就是这么简单。你现在就可以写一个程序,可以做到把docx转为txt。
但是……有一点我要告诉你,运行代码里的wt.text可能会报错,为了便于你理解,我特意写了伪代码。实际上,要从<w:t>中取出文本内容,可以像下面这样:
import re # 导入正则库
# 构建一个正则,去除<>标签
pattern_del_tag = re.compile(r'<[^>] >',re.S)
# 把<w:t>元素转为xml格式<w:t>xxx</w:t>,然后去标签
t_text = pattern_del_tag.sub('', wt.toxml())
我认为这么讲,你反而能理解。因为,不用在理解什么叫<w:t>的时候,还要分散注意力到正则表达式。
3.4 连续块 w:r上面我们讲了如何去解析文字。但是,那太简单了。
文字是有样式的。
都在同一段w:p内的文字,它们的样式,可能不一样。
比如前两个字是红色,那么这两个字样式一样。但是,后两个字是绿色,和前面又不一样。
为了解决这个问题,docx把具有相同样式的文字,用<w:r>标签包裹。
r代表run。关于这个run的解释,很多国内文档都直接翻译为“运行”。
其实,run在英文中有很多解释。我觉得在这里更适合它的释义应该是:“一段”、“一系列”、“连续上演”。因此,我个人给这个标签起名叫:连续块。表示在这个标签之内的文本,是一个系列的,他们的特点是连续不间断的。
代码依然是处理xml文件的那一套,不是找标签就是拿属性。
还有其他的样式标签,你可以自己研究。我这里先抛砖引玉,举两个例子。
比如上面例子中的字体颜色,一般在<w:rPr>标签内。w依然表示word,r表示run,Pr表示Primp,是修饰、装饰的意思。<w:rPr>这个标签的释义就是:连续块的样式说明。类似的还有<w:pPr>,表示对段落paragraph的样式说明。<w:tcPr>,表示对表格单元格table cell的样式说明。
我们来看一下,连续块修饰<w:rPr>是如何定义的。
比如对于粗体、斜体的说明。
用代码进行判断,主要是tag的读取。能找到tag,就说明有此种样式的标记。
w_i = w_rPr.getElementsByTagName("w:i")
if w_i:
print("是斜体")
w_b = w_rPr.getElementsByTagName("w:b")
if w_i:
print("是粗体")
再比如对于各种线条的说明。