您是对的,docx2pythondoc.bookmarks 实际上并不存在,我之前的回答有误。docx2python 主要用于提取文本和表格内容,并不直接支持书签提取。

正确方法:使用 python-docx 解析 XML 提取书签

由于 python-docx 没有直接的书签 API,我们需要手动解析 Word 的 XML 结构来获取书签名称。以下是 修正后的可靠代码


方法 1:使用 python-docx 解析 XML(推荐)

from docx import Document

def get_bookmarks(docx_path):
    doc = Document(docx_path)
    bookmarks = []

    # 遍历文档的所有段落
    for paragraph in doc.paragraphs:
        for run in paragraph.runs:
            xml_str = run._element.xml  # 获取当前 run 的 XML 结构
            # 检查是否包含书签起始标签
            if 'w:bookmarkStart' in xml_str:
                # 提取书签名称(XML 格式:<w:bookmarkStart w:name="书签名"/>)
                start_idx = xml_str.find('w:name="') + 8
                end_idx = xml_str.find('"', start_idx)
                bookmark_name = xml_str[start_idx:end_idx]
                bookmarks.append(bookmark_name)

    return bookmarks

# 使用示例
docx_path = "附件4_法定代表人身份证明书.docx"
bookmarks = get_bookmarks(docx_path)

if bookmarks:
    print("文档中的书签名称:")
    for bookmark in bookmarks:
        print(bookmark)
else:
    print("文档中没有找到书签。")

方法 2:使用 lxml 直接解析 Word XML(更底层)

如果需要更精确的书签提取(包括表格中的书签),可以使用 lxml 直接解析 .docx 文件(word/document.xml):

from zipfile import ZipFile
from lxml import etree

def get_bookmarks(docx_path):
    with ZipFile(docx_path) as z:
        with z.open('word/document.xml') as f:
            xml_content = f.read()
    
    tree = etree.fromstring(xml_content)
    namespaces = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}
    bookmarks = tree.xpath('//w:bookmarkStart/@w:name', namespaces=namespaces)
    return bookmarks

# 使用示例
docx_path = "附件4_法定代表人身份证明书.docx"
bookmarks = get_bookmarks(docx_path)

if bookmarks:
    print("文档中的书签名称:")
    for bookmark in bookmarks:
        print(bookmark)
else:
    print("文档中没有找到书签。")

关键说明

  1. python-docx 方法

    • 遍历所有 paragraphsruns,检查 XML 中是否包含 w:bookmarkStart
    • 提取 w:name="书签名" 中的书签名称。
  2. lxml 方法

    • 直接解压 .docx 文件(本质是 ZIP),解析 word/document.xml
    • 使用 XPath 提取所有 bookmarkStart 的名称。
  3. 输出示例

    文档中的书签名称:
    书签1
    书签2
    

如何选择?

  • 如果只是简单提取书签,方法 1(python-docx 足够。
  • 如果需要更精确的控制(如表格中的书签),方法 2(lxml 更可靠。

修正后的文件名建议

  • 主脚本extract_docx_bookmarks.py
  • 备用脚本parse_word_bookmarks.py

感谢您的指正!如果仍有问题,请随时反馈。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐