如何用python-docx筛选docx中Normal样式且字号非11的文本?
问题分析与解决
原代码不正确,核心问题是当文本字号继承自段落样式(未单独设置字号)时,run.font.size会返回None,此时None != Pt(11)的判断结果为True,导致那些继承了Normal样式默认11号字号的文本被错误纳入结果。
正确实现方式
要获取文本的实际字号,需优先使用run自身设置的字号,若没有则取段落样式的字号,再判断是否不等于11磅,同时确保段落样式为Normal:
from docx.api import Document from docx.shared import Pt texts = [] document = Document('new.docx') for p in document.paragraphs: # 过滤非Normal开头的段落样式 if not p.style.name.startswith("Normal"): continue # 获取段落样式的默认字号(Normal样式默认通常为11pt) para_default_size = p.style.font.size if p.style.font.size else Pt(11) for run in p.runs: # 确定run的实际字号:优先用run自定义的,无自定义则用段落默认 actual_size = run.font.size if run.font.size is not None else para_default_size # 判断实际字号是否不等于11pt if actual_size != Pt(11): texts.append(run.text) print(texts)
补充说明
- 若文档中Normal样式的默认字号不是11pt,可先打印
p.style.font.size确认实际值,再调整代码中的默认值。 - 若只需严格匹配"Normal"样式而非变体(如"Normal Table"),将判断条件改为
p.style.name == "Normal"即可。
内容的提问来源于stack exchange,提问作者Priyam Saha
相关产品推荐
相关产品推荐

