You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python提取XML文件中附带的PDF附件

解决XML内嵌PDF提取问题

错误原因

你遇到的TypeError是因为soup.attachment返回的是BeautifulSoup的Tag对象,不是字符串类型的文件名。另外代码里response.content未定义,且XML中<Attachment>的内容是ZIP压缩后的Base64编码数据(对应<AlgoritmoCompressione>ZIP</AlgoritmoCompressione>),需要先解码再解压才能得到PDF。

正确实现步骤

  1. 解析XML,提取<NomeAttachment>的文件名和<Attachment>的Base64编码内容。
  2. 将Base64内容解码为字节数据。
  3. 将字节数据作为ZIP文件读取,提取内部的PDF。

修正后的代码

from bs4 import BeautifulSoup
import base64
import zipfile
from io import BytesIO

# 读取XML文件
path = "你的XML文件路径.xml"
with open(path, 'r', encoding='utf-8') as file_xml:
    xml_data = file_xml.read()

# 用XML专用解析器解析内容
soup = BeautifulSoup(xml_data, 'xml')

# 获取目标文件名和Attachment的Base64内容
file_name = soup.find('NomeAttachment').get_text(strip=True)
attachment_base64 = soup.find('Attachment').get_text(strip=True)

# 解码Base64为字节数据
zip_bytes = base64.b64decode(attachment_base64)

# 解压ZIP并保存PDF文件
with BytesIO(zip_bytes) as zip_file:
    with zipfile.ZipFile(zip_file, 'r') as zf:
        # 遍历ZIP内文件(假设仅包含目标PDF)
        for zip_info in zf.infolist():
            with open(file_name, 'wb') as f:
                f.write(zf.read(zip_info))
                print(f"PDF文件已保存为: {file_name}")

关键说明

  • 使用'xml'解析器:BeautifulSoup的html.parser专为HTML设计,解析XML时用'xml'解析器更准确(需提前安装lxml库,可运行pip install lxml完成安装)。
  • Base64解码:<Attachment>节点内容是经过Base64编码的ZIP包,必须通过base64.b64decode转换为字节数据才能处理。
  • ZIP解压:用BytesIO将字节数据模拟为文件对象,再通过zipfile.ZipFile读取解压,最终保存为对应文件名的PDF。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:35:07