如何用Python解析Word文档(.docx)中的XML数据

畫卷琴夢
发布: 2025-12-18 13:08:02
原创
353人浏览过
Python通过python-docx库或手动解压.docx ZIP包来解析其内部XML文件;前者用_element.xml获取段落等原始XML,后者用zipfile+etree/lxml读取document.xml等核心文件,并需正确处理命名空间。

如何用python解析word文档(.docx)中的xml数据

Python本身不直接解析Word文档的底层XML,而是通过python-docx库操作.docx文件——因为.docx本质是ZIP压缩包,内部包含多个XML文件(如document.xmlstyles.xml等)。若需访问原始XML数据,有两种主流方式:一是用python-docx间接获取XML片段;二是手动解压.docx并解析目标XML文件。

python-docx提取段落/表格的XML结构

python-docx虽为高层接口,但每个元素(如ParagraphRun)都提供_element属性,可直接访问底层lxml Element对象,进而读取或修改其XML。

  • 安装依赖:pip install python-docx lxml
  • 读取段落XML示例:
    from docx import Document
    <p>doc = Document("example.docx")
    p = doc.paragraphs[0]  # 获取第一个段落
    xml_str = p._element.xml  # 返回该段落的完整XML字符串(含命名空间)
    print(xml_str[:200])  # 查看前200字符
    
    登录后复制
  • 注意:_element.xml返回的是带namespaces的原始XML,可能含w:前缀(如<p></p>),解析时需处理命名空间或用lxml的XPath配合{http://schemas.openxmlformats.org/wordprocessingml/2006/main}

手动解压.docx并读取核心XML文件

.docx是ZIP格式,可用Python内置zipfile模块解压,再用xml.etree.ElementTreelxml解析指定XML。

  • 关键XML路径(在解压后目录中):
    • word/document.xml:主文档内容(段落、文字、制表符等)
    • word/styles.xml:样式定义
    • word/numbering.xml:编号与项目符号规则
    • word/settings.xml:文档设置
  • 示例:提取document.xml中的所有段落文本(忽略格式):
    import zipfile
    import xml.etree.ElementTree as ET
    <p>with zipfile.ZipFile("example.docx") as docx:
    with docx.open("word/document.xml") as f:
    tree = ET.parse(f)
    root = tree.getroot()</p><h1>Word XML默认命名空间</h1><pre class="brush:php;toolbar:false;">    ns = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"}
        for p in root.findall(".//w:p", ns):
            text = "".join(t.text for t in p.findall(".//w:t", ns) if t.text)
            print(text.strip())
    登录后复制
    <p></p>

    立即学习Python免费学习笔记(深入)”;

    Android数据格式解析对象JSON用法 WORD版
    Android数据格式解析对象JSON用法 WORD版

    本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

    Android数据格式解析对象JSON用法 WORD版 0
    查看详情 Android数据格式解析对象JSON用法 WORD版

用lxml做深度XML分析(推荐用于复杂需求)

当需XPath查询、命名空间灵活处理、或修改后重新打包时,lxml标准库更强大。

  • 安装:pip install lxml
  • 读取并查询带样式的段落:
    from lxml import etree
    import zipfile
    <p>with zipfile.ZipFile("example.docx") as docx:
    with docx.open("word/document.xml") as f:
    tree = etree.parse(f)</p><h1>使用XPath查找所有应用了"Heading1"样式的段落</h1><pre class="brush:php;toolbar:false;">    ns = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"}
        headings = tree.xpath("//w:p[w:pPr/w:pStyle[@w:val='Heading1']]", namespaces=ns)
        for h in headings:
            text = "".join(h.xpath(".//w:t/text()", namespaces=ns))
            print("标题:", text.strip())
    登录后复制
    <p></p>

    立即学习Python免费学习笔记(深入)”;

  • 修改XML后,可调用tree.write()保存,并用zipfile重建.docx(需保留其他文件结构)。

注意事项与常见问题

直接操作XML有风险,务必备份原文件;且Word生成的XML结构较复杂,嵌套深、命名空间多。

  • 命名空间必须匹配:OpenXML规范强制使用w:等前缀,XPath或find操作必须声明对应URI,否则查不到节点。
  • 中文乱码XML本身是UTF-8编码zipfile.open()返回bytes,etree.parse()lxml.etree.parse()能自动识别,无需手动decode。
  • 图片、页眉页脚在哪?图片存在word/media/,页眉页脚在word/header.xml/footer.xml,需单独解压读取。
  • 不建议从零构建.docx:手动拼XML易出错,优先用python-docx生成,仅在特殊分析场景才深入XML层。

以上就是如何用Python解析Word文档(.docx)中的XML数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号