You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python-docx获取word/_rels/header1.xml.rels文件中的URL

用Python提取Word文档中header关联rels文件里的URL

嘿,这个问题我刚好折腾过!python-docx本身并没有直接暴露访问header对应的_rels文件的API,不过别担心——docx本质上就是个ZIP压缩包,所有的XML部件都藏在里面,咱们可以直接操作这个ZIP包来读取word/_rels/header1.xml.rels,再解析出里面的URL。

下面是具体的实现步骤和代码:

步骤1:先搞懂docx的结构

Word文档解压后,word/headers/目录下存着各个页眉的XML文件,对应的关联关系文件放在word/_rels/目录下,命名规则是headerN.xml.rels(N是数字,比如header1、header2),里面记录了页眉里的超链接、图片等外部资源的关联信息。

步骤2:用zipfile读取rels文件

我们可以用Python标准库的zipfile打开docx文档,直接读取目标rels文件的内容,再用xml.etree.ElementTree解析XML。

完整代码示例

import zipfile
import xml.etree.ElementTree as ET

def extract_header_rels_urls(docx_path, header_rel_filename="word/_rels/header1.xml.rels"):
    urls = []
    # 定义rels文件的XML命名空间,必须指定才能正确解析元素
    ns = {'rels': 'http://schemas.openxmlformats.org/package/2006/relationships'}
    
    try:
        with zipfile.ZipFile(docx_path, 'r') as zip_ref:
            # 先检查目标rels文件是否存在于压缩包中
            if header_rel_filename not in zip_ref.namelist():
                print(f"警告:未找到文件 {header_rel_filename}")
                return urls
            
            # 读取rels文件的内容并解析XML
            with zip_ref.open(header_rel_filename) as rel_file:
                tree = ET.parse(rel_file)
                root = tree.getroot()
                
                # 遍历所有关联条目,筛选出超链接类型的URL
                for rel in root.findall('rels:Relationship', ns):
                    rel_type = rel.get('Type')
                    # 超链接的类型标识是固定的这个URL
                    if rel_type == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink':
                        url = rel.get('Target')
                        if url:
                            urls.append(url)
        return urls
    
    except Exception as e:
        print(f"处理过程出错:{str(e)}")
        return urls

# 使用示例
if __name__ == "__main__":
    docx_file = "你的文档路径.docx"
    # 提取header1的rels文件里的URL
    header_urls = extract_header_rels_urls(docx_file)
    print("提取到的URL:")
    for url in header_urls:
        print(url)
    
    # 如果要提取所有页眉的rels文件,可以遍历压缩包中的相关文件
    with zipfile.ZipFile(docx_file, 'r') as zip_ref:
        all_header_rels = [f for f in zip_ref.namelist() if f.startswith('word/_rels/header') and f.endswith('.xml.rels')]
        print("\n所有页眉关联文件:")
        for rel_file in all_header_rels:
            urls = extract_header_rels_urls(docx_file, rel_file)
            print(f"\n来自{rel_file}的URL:")
            for url in urls:
                print(url)

几个关键点要注意

  • 命名空间不能漏:rels文件里的元素都属于特定的XML命名空间,不指定ns参数的话,根本找不到对应的元素。
  • 超链接类型判断:我们筛选Type属性为固定值的条目,这些就是页眉里的超链接URL。
  • 容错处理:代码里加了文件存在性检查和异常捕获,避免因为文档结构不同或者文件损坏导致程序崩溃。

内容的提问来源于stack exchange,提问作者shibashis

火山引擎 最新活动