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

Can not get the text in ContentControl in Word by usting Python-docx

ContentControl Document

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

例如,我尝试打印第一段,使用

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中的文本呢? 非常感谢您的帮助!

你不能,Python-docx。

如果您检查 https://github.com/python-openxml/python-docx/blob/master/docx/oxml/text/paragraph.py——读取段落及其内容的代码——,您可以看到它只解析了 <w:p> 中的两个 sub-elements:它的格式来自 <w:pPr>,其文本 运行 来自 <w:r>。文本 运行 的内容使用 text/run.py 进行解析,它遍历其元素并存储数据 rPr(本地文本 运行 格式),t (纯文本本身)和 tab(文字选项卡),以及其他一些。

但是Word的"contentControl"存储在另一个标签中,没有解析!

<strong><w:p></strong>  <!-- paragraph -->
  <strong><w:r></strong>  <!-- text runs -->
    <strong><w:t>Editions&#160;:</w:t></strong>  <!-- plain text -->
  <strong></w:r></strong>  <!-- end text run -->
  <em><w:sdt>
    <w:sdtPr>
    <w:sdtContent></em>   <!-- something else! -->
      <em><w:r>
        <w:t>Henry</w:t>
      </w:r>
    </w:sdtContent>
  </w:sdt></em>
  <strong><w:r></strong>  <!-- next text run; just a tab -->
    <w:tab/>
    <w:t xml:space="preserve"> </w:t>
  <strong></w:r></strong>  <!-- end of that text run -->
</w:p>

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

如您所见,ContentControl 数据位于 <w:sdt> 标记内,该标记又是 <w:p> 的直接后代。所以读取它的数据的代码应该在paragraph.py,但它不是

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


顺便说一句,您的错误代码与此无关。 "offending"字符是"Editions"行中的non-breakingspace,存储为&#160;。您的文本解码器应该真的没有任何问题。该问题可能是由于您使用 gbk 解码器而不是 UTF-8 引起的。文档中有一些汉字,也写成十进制转义的Unicode字符;没有 non-ASCII 个字符。