编写脚本从SOAP输出XML提取图片链接并下载至WooCommerce或FTP文件夹
解决方案:从SOAP XML下载图片到指定文件夹或FTP
一、下载到本地WooCommerce文件夹
WooCommerce媒体文件默认存储在wp-content/uploads/目录(可根据实际路径调整),以下是Python脚本实现:
依赖安装
先安装所需工具包:
pip install requests
脚本代码
import os import requests from xml.etree import ElementTree as ET from urllib.parse import urlparse, parse_qs # 配置参数 XML_FILE_PATH = "your_soap_output.xml" # 替换为你的SOAP输出XML文件路径 TARGET_FOLDER = "/path/to/woocommerce/wp-content/uploads/" # 替换为WooCommerce的uploads目录 def extract_image_info(xml_path): """解析XML,提取图片链接和对应文件名""" tree = ET.parse(xml_path) root = tree.getroot() image_list = [] for product in root.findall("Product"): img_url_elem = product.find("FDI_0843") if img_url_elem is not None and img_url_elem.text: img_url = img_url_elem.text # 从URL的query参数中提取nomefile作为文件名 parsed_url = urlparse(img_url) query_params = parse_qs(parsed_url.query) filename = query_params.get("nomefile", [None])[0] if filename: image_list.append((img_url, filename)) return image_list def download_images(image_list, target_folder): """批量下载图片到目标文件夹""" # 自动创建目标文件夹(不存在时) os.makedirs(target_folder, exist_ok=True) for img_url, filename in image_list: try: response = requests.get(img_url, stream=True) response.raise_for_status() # 检查请求是否成功 file_path = os.path.join(target_folder, filename) with open(file_path, "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"已下载:{filename}") except Exception as e: print(f"下载失败 {img_url}:{str(e)}") if __name__ == "__main__": images = extract_image_info(XML_FILE_PATH) download_images(images, TARGET_FOLDER)
关键说明
- 替换
XML_FILE_PATH为你的SOAP输出XML实际路径 - 替换
TARGET_FOLDER为WooCommerce的uploads目录(Windows路径示例:C:\xampp\htdocs\your-site\wp-content\uploads\) - 脚本自动从图片链接的
nomefile参数提取文件名,确保与XML指定的一致 - 包含异常捕获,下载失败会打印具体错误信息
二、上传到FTP文件夹
如果需要将图片直接上传到远程FTP服务器(比如WooCommerce的远程媒体服务器),可在下载后添加FTP上传逻辑,扩展脚本如下:
脚本代码
import os import requests from xml.etree import ElementTree as ET from urllib.parse import urlparse, parse_qs from ftplib import FTP # 配置参数 XML_FILE_PATH = "your_soap_output.xml" LOCAL_TEMP_FOLDER = "./temp_images/" # 临时存储下载的图片 # FTP服务器配置 FTP_HOST = "ftp.your-server.com" FTP_USER = "ftp_username" FTP_PASS = "ftp_password" FTP_TARGET_FOLDER = "/wp-content/uploads/" # FTP上的目标目录 def extract_image_info(xml_path): # 同本地下载的解析逻辑,省略重复代码 tree = ET.parse(xml_path) root = tree.getroot() image_list = [] for product in root.findall("Product"): img_url_elem = product.find("FDI_0843") if img_url_elem is not None and img_url_elem.text: img_url = img_url_elem.text parsed_url = urlparse(img_url) query_params = parse_qs(parsed_url.query) filename = query_params.get("nomefile", [None])[0] if filename: image_list.append((img_url, filename)) return image_list def download_images(image_list, temp_folder): os.makedirs(temp_folder, exist_ok=True) downloaded_files = [] for img_url, filename in image_list: try: response = requests.get(img_url, stream=True) response.raise_for_status() file_path = os.path.join(temp_folder, filename) with open(file_path, "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) downloaded_files.append(file_path) print(f"已下载:{filename}") except Exception as e: print(f"下载失败 {img_url}:{str(e)}") return downloaded_files def upload_to_ftp(local_files, ftp_host, ftp_user, ftp_pass, ftp_target_folder): """上传本地文件到FTP服务器""" try: with FTP(ftp_host) as ftp: ftp.login(user=ftp_user, passwd=ftp_pass) ftp.cwd(ftp_target_folder) # 切换到FTP目标目录 for local_file in local_files: filename = os.path.basename(local_file) with open(local_file, "rb") as f: ftp.storbinary(f"STOR {filename}", f) print(f"已上传到FTP:{filename}") # 可选:上传完成后删除本地临时文件 os.remove(local_file) except Exception as e: print(f"FTP操作失败:{str(e)}") if __name__ == "__main__": images = extract_image_info(XML_FILE_PATH) downloaded_files = download_images(images, LOCAL_TEMP_FOLDER) upload_to_ftp(downloaded_files, FTP_HOST, FTP_USER, FTP_PASS, FTP_TARGET_FOLDER)
关键说明
- 配置
FTP_HOST、FTP_USER、FTP_PASS为你的FTP服务器真实信息 - 脚本先将图片下载到本地临时目录,再上传到FTP,上传后可选择删除临时文件
- 确保FTP服务器的目标文件夹有写入权限
额外注意事项
- 如果XML包含命名空间,解析时需指定命名空间,例如
root.findall("{http://your-namespace.com}Product") - 若需要直接从SOAP接口获取XML(无需先保存到本地),可使用
zeep库添加SOAP请求逻辑 - 批量下载大量图片时,可使用
requests-futures实现并发请求,提高下载效率
内容的提问来源于stack exchange,提问作者Lab Ev.
相关产品推荐
相关产品推荐

