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

Python3下Scrapy爬取含JS的JSON字符串解码失败求助

我太懂这种卡壳的感觉了——好不容易用Scrapy爬下来数据,结果卡在JSON解析这一步,各种转义、编码试了个遍还是报错。咱们来拆解问题,找到靠谱的解决方案:

问题根源

你遇到的核心问题是:

  • 带r前缀的scraped_raw是原始字符串,里面的\n、\u003C都是字面量字符(也就是\+n、\+u003C),JSON解析器能正确识别这些转义序列。
  • 而scraped是普通字符串,Python已经把\n解析成了实际的换行符,把\u003C解析成了<字符。JSON规范不允许字符串中存在未转义的实际换行符,所以json.loads(scraped)会报错。

短字符串能用unicode_escape解决,是因为字符少,没触发那些特殊的转义冲突;但长字符串里可能存在一些不规范的转义(比如\x、\开头的无效序列),导致解码失败。

解决方案:用ast.literal_eval替代json.loads

既然你的目标是便捷访问数据,不一定非要严格走JSON解析流程。Python的ast.literal_eval可以解析Python风格的字面量(包括字典、列表),它对换行符、特殊字符的容忍度更高,完美适配你这种场景:

import ast

# 你爬取到的字符串
scraped = '{"propertyNotes": [{"title": "Local Description", "text": "\u003Cp\u003EAPPS\u003C/p\u003E\n\n\u003Cp\u003EBig Island Revealed (comes as app or as a printed book)\u003C/p\u003E\n\n\u003Cp\u003EAloha Big Island\u003C/p\u003E\n\n\u003Cp\u003EBig Island\u003C/p\u003E\n\n\u003Cp\u003EBig Island Smart Maps (I like this one a lot)\u003C/p\u003E\n\n\u003Cp\u003EBig Island Adventures (includes videos)\u003C/p\u003E\n\n\u003Cp\u003EThe descriptions of beaches are helpful. Suitability for swimming, ease of access, etc. is included. Some beaches are great for picnics and scenic views, while others are suitable for swimming and snorkeling. Check before you go.\u003C/p\u003E"}]}'

# 用ast.literal_eval解析成Python字典
data = ast.literal_eval(scraped)

# 现在可以直接访问数据了
print(data["propertyNotes"])

备选方案:修复转义后再用json.loads

如果你一定要用标准的json模块,可以先把字符串里的实际换行符转义成JSON能识别的\n,同时处理其他特殊字符:

import json

def fix_json_string(s):
    # 把实际换行符转成JSON转义的\n,回车符同理
    s = s.replace('\n', '\\n').replace('\r', '\\r')
    # 确保双引号没有被错误转义(如果有的话)
    s = s.replace('\\"', '"')
    return s

scraped = '{"propertyNotes": [{"title": "Local Description", "text": "\u003Cp\u003EAPPS\u003C/p\u003E\n\n\u003Cp\u003EBig Island Revealed..."}]}'
fixed_scraped = fix_json_string(scraped)
data = json.loads(fixed_scraped)
print(data["propertyNotes"])

为什么之前的unicode_escape方法失效?

unicode_escape会把所有Unicode字符转义成\uXXXX格式,但如果你的长字符串里包含一些原本就有反斜杠的内容(比如\、\x),会被错误转义成无效的JSON序列,导致JSONDecodeError。ast.literal_eval则是直接解析Python字面量,不会篡改这些内容,所以更稳定。

内容的提问来源于stack exchange,提问作者Dennis Pitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:40