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

标签 python ms-word 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> 的两个子元素:其格式来自 <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 宏将它们转换为纯文本。


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

关于python - 无法使用Python-docx获取Word中ContentControl中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49158107/

相关文章:

javascript - 使用 HTML 和 javascript 或 css 或 jquery 技术

error-handling - 区分 `on error goto`发生的两个错误并分别处理

python - 如何使用 Python-Docx 将自定义 XML 添加到元素?

python-3.x - 突出显示python中的文本并将其保存在word文件中

python - 测试自定义异常的引发时出错(使用 assertRaises())

python - Bitbucket git push 提交而不克隆存储库

python - Bokeh :在同一侧显示具有多个 Y 轴的附加 Y 轴标签

python - 如何解决Python Git子模块的依赖关系

c# - 如何使用 DocX 控制 Word 文档中的表格列宽?

python - 如何设置内边距和外边距