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
相关产品推荐
相关产品推荐

