了解docx文件中的书签

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:bookmarkStartw:bookmarkEnd元素的书签(因此您链接的段落不包含书签)和
  • 仅仅因为您发现w:bookmarkStart元素而检索w:p的全文是不正确的。

还有更多需要注意的事项:

  • 一个书签可以跨越多个段落,省略包含w:bookmarkStartw:p的一个或多个前导运行,以及包含w:bookmarkEndw:p的一个或多个尾随运行。
  • w:bookmarkStartw:bookmarkEnd甚至可以出现在w:p元素之外,例如,作为w:body的子元素。

这篇关于了解docx文件中的书签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)