无法通过使用Python-docx获取Word中ContentControl中的文本

时间:2018-03-07 17:39:12

标签: python ms-word python-docx

ContentControl Document

我是Python和编码的新手。新的我有问题,需要你的帮助。 我尝试使用Python-docx读取docx文档,但我想要的所有文本都在ContentControl中。当我尝试使用ContentControl打印段落的文本时,会发生错误。

例如,我尝试使用

打印第一个paragraphe
import docx
doc= docx.Document("C:\ContentControl.docx")
p=doc.paragraphs
print(p[0].text)

然后我收到如下错误:

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 8: illegal multibyte sequence

那么我该怎么做才能在ContentControl中获取文本? 非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

你不能,使用Python-docx。

如果您检查https://github.com/python-openxml/python-docx/blob/master/docx/oxml/text/paragraph.py - 读取段落及其内容的代码 - ,您可以看到它只解析<w:p>的两个子元素:来自<w:pPr>的格式,以及其文本从<w:r>开始。文本运行的内容使用text/run.py进行解析,它遍历其元素并存储rPr的数据(本地文本运行格式),t(纯文本本身)和{{ 1}}(一个文字标签),还有一些。

但Word的“contentControl”存储在另一个标记中,已解析!

tab

(来自您的示例文档;为简洁起见,省略了一些代码)

如您所见,ContentControl数据位于<w:p> <!-- paragraph --> <w:r> <!-- text runs --> <w:t>Editions&#160;:</w:t> <!-- plain text --> </w:r> <!-- end text run --> <w:sdt> <w:sdtPr> <w:sdtContent> <!-- something else! --> <w:r> <w:t>Henry</w:t> </w:r> </w:sdtContent> </w:sdt> <w:r> <!-- next text run; just a tab --> <w:tab/> <w:t xml:space="preserve"> </w:t> </w:r> <!-- end of that text run --> </w:p>标记内,而<w:sdt>标记又是<w:p>的直接后代。因此,读取其数据的代码应该在paragraph.py中,但不是。

您可以克隆python-docx并自行添加<w:sdt>的正确处理(here就是您需要的所有信息),但使用Word本身可能更容易,使用VBA宏将这些宏转换为纯文本。

顺便说一下,你的错误代码与此无关。 “违规”字符是“版本”行中的不间断空格,存储为&#160;。您的文本解码器应该没有任何问题。问题可能是由于您使用gbk解码器而不是UTF-8引起的。文档中有一些中文字符,但也写成十进制转义的Unicode字符;没有非ASCII字符。