如何使用Python提取XML文件中附带的PDF附件
解决XML内嵌PDF提取问题
错误原因
你遇到的TypeError是因为soup.attachment返回的是BeautifulSoup的Tag对象,不是字符串类型的文件名。另外代码里response.content未定义,且XML中<Attachment>的内容是ZIP压缩后的Base64编码数据(对应<AlgoritmoCompressione>ZIP</AlgoritmoCompressione>),需要先解码再解压才能得到PDF。
正确实现步骤
- 解析XML,提取
<NomeAttachment>的文件名和<Attachment>的Base64编码内容。 - 将Base64内容解码为字节数据。
- 将字节数据作为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
相关产品推荐
相关产品推荐

