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

编写脚本从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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:05:59