Python中如何解析淘宝的非常规JSON数据?

python 版本: 2.7 本人能力:非程序员,有一点点喜欢 python ,想折腾一些数据采集之类的,以便今后转运营助理或者运营,方便数据记录、分析。 环境模拟:想要采集皮鞋第一页、第二页全部产品的标题、图片、价格等前端展现的内容,可能详情页也需要用代码做截图处理,可能需要采集正文和评价。 问题:淘宝里的 json 是非正常的,由于技术问题,先用 sub 替换了 jsonp232(),也不能正常解析。求前辈折腾一下。

json 地址: https://s.taobao.com/api?_ksTS=1489731701469_231&callback=jsonp232&ajax=true&m=customized&rn=2e8936bb027bece89209046885ec042a&q=%E7%9A%AE%E9%9E%8B&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20170317&ie=utf8&s=36&bcoffset=-3

python 不用处理就能正常 dumps 、 load 能解析的 普通 json 淘宝 json 淘宝 json


Python中如何解析淘宝的非常规JSON数据?

9 回复

这个是 JSONP 的,不光是最前面有额外字符,最后面也有字符


我经常处理淘宝API返回的JSON,确实会遇到一些“非常规”格式。最常见的问题是JSONP响应不标准的JSON结构

1. JSONP响应处理 淘宝有些接口返回的是JSONP格式,比如:

callbackFunction({"status": "success", "data": {...}})

你需要先提取JSON部分:

import re
import json

response = 'callbackFunction({"status": "success", "data": {}})'
# 提取大括号内的内容
match = re.search(r'\{.*\}', response)
if match:
    data = json.loads(match.group())
    print(data)

2. 键名不规范的JSON 淘宝JSON有时键名不带引号或使用单引号:

# 使用demjson库处理非标准JSON
# pip install demjson
import demjson

nonstandard_json = "{status: 'success', data: {}}"
data = demjson.decode(nonstandard_json)
print(data)

3. 完整的处理方案

import re
import json
import demjson
from typing import Union

def parse_taobao_json(response_text: str) -> Union[dict, list]:
    """
    解析淘宝API返回的各种JSON格式
    """
    # 尝试标准JSON解析
    try:
        return json.loads(response_text)
    except json.JSONDecodeError:
        pass
    
    # 处理JSONP格式
    jsonp_match = re.search(r'\((\{.*\})\)', response_text)
    if jsonp_match:
        try:
            return json.loads(jsonp_match.group(1))
        except:
            pass
    
    # 使用demjson处理非标准格式
    try:
        return demjson.decode(response_text)
    except:
        raise ValueError("无法解析的JSON格式")

# 使用示例
response1 = 'jsonp123({"code":0,"data":{}})'
response2 = "{code: 0, 'data': []}"

print(parse_taobao_json(response1))
print(parse_taobao_json(response2))

简单总结:先用标准库处理,不行再用demjson兜底。

ls +1
地址里的 callback=jsonp232 直接改为 callback= 不就是 json 了

谢谢上面两个大神 我测试一下

不一一答谢了,各位层主谢谢,搞定了。

js=1 我觉得也要删

回到顶部