无法通过使用 Python-docx 获取 Word 中 ContentControl 中的文本
Can not get the text in ContentControl in Word by usting Python-docx
我是 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 :</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,存储为 
。您的文本解码器应该真的没有任何问题。该问题可能是由于您使用 gbk
解码器而不是 UTF-8 引起的。文档中有一些汉字,也写成十进制转义的Unicode字符;没有 non-ASCII 个字符。
我是 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 :</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,存储为 
。您的文本解码器应该真的没有任何问题。该问题可能是由于您使用 gbk
解码器而不是 UTF-8 引起的。文档中有一些汉字,也写成十进制转义的Unicode字符;没有 non-ASCII 个字符。