Understanding bookmarks in docx file(了解docx文件中的书签)
本文介绍了了解docx文件中的书签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试从Docx文件中提取书签,我编写了一段代码来提取一些Docx文件中的书签,但它在一些docx文件中找不到任何书签。我使用的是python-docx
我基本上是在查找w:bookmarkStart
标记并转到其父标记并检索段落中的所有运行。但有些文档既没有w:bookmarkStart
,也没有超级链接标签,但DOCX查看器能够识别书签。
以下是段落的XML内容,它是docx查看器中的书签,但不包含任何书签或超链接标记。
注意:我提到的代码适用于使用Google Docs创建的Docx文件。
from docx.oxml.shared import qn
from docx import Document
def get_toc(self):
doc_element = self.document.part._element
bookmarks_list = doc_element.findall('.//' + qn('w:bookmarkStart'))
for bookmark in bookmarks_list:
par = bookmark.getparent()
runs = par.findall(qn('w:r'))
for run in runs:
try:
print(' ', run.find(qn('w:t')).text, end=' ')
except:
pass
print('
','-'*50)
我是遗漏了什么,还是需要查找其他标记?
如果没有,我如何在这种情况下识别书签?
推荐答案
在Open XML文档中,书签由一对匹配的w:bookmarkStart
和一个w:bookmarkEnd
元素定义,其中每个元素都有一个具有相同值的w:id
属性。
以下是一个示例段落,其书签仅包含文本"Second",而不包含该段落的全文(例如,"First,Second,and Third")。
<w:p>
<w:r>
<w:t xml:space="preserve">First, </w:t>
</w:r>
<w:bookmarkStart w:id="1" w:name="MyBookmarkName" />
<w:r>
<w:t>second</w:t>
</w:r>
<w:bookmarkEnd w:id="1" />
<w:r>
<w:t>, and third.</w:t>
</w:r>
</w:p>
这意味着:
- 没有
w:bookmarkStart
和w:bookmarkEnd
元素的书签(因此您链接的段落不包含书签)和 - 仅仅因为您发现
w:bookmarkStart
元素而检索w:p
的全文是不正确的。
还有更多需要注意的事项:
- 一个书签可以跨越多个段落,省略包含
w:bookmarkStart
的w:p
的一个或多个前导运行,以及包含w:bookmarkEnd
的w:p
的一个或多个尾随运行。 w:bookmarkStart
和w:bookmarkEnd
甚至可以出现在w:p
元素之外,例如,作为w:body
的子元素。
这篇关于了解docx文件中的书签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:了解docx文件中的书签
基础教程推荐
猜你喜欢
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01