
searchspring 搜索 api 会将部分字段(如 `child_sku_options`)以 html 实体编码的字符串形式返回,直接调用 `json.loads()` 会导致解析失败或出现乱码;需先用 `html.unescape()` 解码,再二次解析为 json 对象。
在使用 SearchSpring 的搜索接口(如 /api/search/search.json)时,一个常见陷阱是:API 响应本身是合法 JSON,但其内部某些字段(例如 child_sku_options、custom_fields 或 facets 中的值)并非原始 JSON 对象,而是被双重序列化并 HTML 转义的字符串。这表现为 URL 中的 / 变成 \\/、引号变成 "、甚至整个 JSON 数组被包裹在双引号中作为字符串字段——导致 json.loads(response.content) 报错或输出不可用的乱码片段。
根本原因在于 SearchSpring 为兼容前端渲染(如 Handlebars 模板),对嵌套结构做了 JSON.stringify() + encodeURIComponent() 或类似处理,最终以 HTML-safe 字符串形式嵌入主响应中。
✅ 正确处理步骤如下:
- 正常请求并解析顶层 JSON:使用 requests.get() 获取响应后,直接调用 response.json()(推荐)或 json.loads(response.content) 解析外层结构;
- 定位被转义的字段:如 data["results"][0]["child_sku_options"],其值是一个类似 "[{"option":"Hand","value":"Mens Right"}] 的字符串;
- HTML 解码:用 html.unescape() 还原 " → "、/ → / 等实体;
- 二次 JSON 解析:对解码后的字符串再次执行 json.loads(),获得真正的 Python 列表/字典。
以下是完整、健壮的示例代码:
import json
import requests
from html import unescape
url = "https://547os1.a.searchspring.io/api/search/search.json?ajaxCatalog=v3&resultsFormat=native&siteId=547os1&domain=https%3A%2F%2Fwww.golfbox.com.au%2Fsearch%3Fq%3DCalaway%2BParadym%2BDriver%26Search%3DSEARCH&q=Calaway%20Paradym%20Driver"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers, verify=False)
response.raise_for_status() # 显式检查 HTTP 错误
# 解析顶层 JSON
data = response.json()
# 安全遍历 results 并解析每个 child_sku_options
for result in data.get("results", []):
options_str = result.get("child_sku_options")
if not options_str:
continue
try:
# 先 HTML 解码,再 JSON 解析
options_list = json.loads(unescape(options_str))
print(f"Product ID: {result.get('id')}, Found {len(options_list)} SKU options")
# 示例:打印第一个选项的规格
if options_list:
first_opt = options_list[0]
print(f" → {first_opt.get('option')}: {first_opt.get('value')} | SKU: {first_opt.get('child_sku')}")
except (json.JSONDecodeError, TypeError) as e:
print(f"⚠️ Failed to parse child_sku_options for product {result.get('id')}: {e}")? 关键注意事项:
- ❌ 不要跳过 unescape() 直接 json.loads() —— 否则会因 " 等非法字符报 JSONDecodeError;
- ✅ 优先使用 response.json() 而非 json.loads(response.content),前者自动处理编码(如 UTF-8 BOM);
- ⚠️ 生产环境务必启用 response.raise_for_status() 并捕获异常,避免静默失败;
- ? verify=False 仅用于调试,正式部署应保留 SSL 验证(移除该参数或配置可信证书);
- ? 若遇到其他转义字段(如 custom_fields),采用相同 unescape() → json.loads() 模式即可复用。
通过这一模式,你就能稳定、准确地提取 SearchSpring 返回的深层结构化商品选项数据,避免“奇怪字符”干扰,真正实现自动化解析与后续处理。










