我是Python和编码的新手。新的我有问题,需要你的帮助。 我尝试使用Python-docx读取docx文档,但我想要的所有文本都在ContentControl中。当我尝试使用ContentControl打印段落的文本时,会发生错误。
例如,我尝试使用
打印第一个paragrapheimport 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中获取文本? 非常感谢你的帮助!
答案 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 :</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宏将这些宏转换为纯文本。
顺便说一下,你的错误代码与此无关。 “违规”字符是“版本”行中的不间断空格,存储为 
。您的文本解码器应该没有任何问题。问题可能是由于您使用gbk
解码器而不是UTF-8引起的。文档中有一些中文字符,但也写成十进制转义的Unicode字符;没有非ASCII字符。