我是 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 :</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”行中的不间断空格,存储为  
。您的文本解码器实际上应该没有任何问题。该问题可能是由您使用 gbk
引起的解码器而不是 UTF-8。文档中有一些汉字,也写成十进制转义的Unicode字符;没有非 ASCII 字符。
关于python - 无法使用Python-docx获取Word中ContentControl中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49158107/