VBA爬取Redfin网页时JsonConverter解析JSON报错10001如何解决?
JSON解析报错原因
- 转义处理逻辑错误:原代码使用
Replace(itemStr, "\", "")全量删除反斜杠,破坏了JSON转义规则。Redfin返回的JS上下文内的对象字面量用\"转义双引号,全删反斜杠会同时破坏\n、\uXXXX、\\等合法转义结构,导致JSON格式失效。 - 未做匹配校验:正则未匹配到对应内容时直接取下标
jsonStr(0)会触发额外错误,也可能导致送入解析的内容为空或非法。
修正后代码
Sub GrabRedfinInfo() Const siteLink$ = "https://www.redfin.com/TX/Austin/604-Amesbury-Ln-78752/unit-2/home/171045975" Dim Http As Object Dim jsonObject As Object, jsonStr As Object Dim itemStr As String, sResp As String Dim sc As Object, i As Long ' 前置要求:已导入JsonConverter库,引用Microsoft Scripting Runtime Set Http = CreateObject("MSXML2.XMLHTTP.6.0") Set sc = CreateObject("ScriptControl") sc.Language = "JScript" With Http .Open "Get", siteLink, False .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" .send sResp = .responseText End With With CreateObject("VBScript.RegExp") .Global = False .Pattern = "reactServerState\.InitialContext = (.*?);[\r\n]" .MultiLine = True Set jsonStr = .Execute(sResp) If jsonStr.Count = 0 Then MsgBox "未匹配到目标数据段" Exit Sub End If itemStr = jsonStr(0).SubMatches(0) End With ' 用JS引擎直接序列化对象,避免手动处理转义出错 itemStr = sc.Eval("JSON.stringify(" & itemStr & ")") Set jsonObject = JsonConverter.ParseJson(itemStr) ' 提取目标状态字段 Dim targetData As Object Set targetData = jsonObject("ReactServerAgent.cache")("dataCache")("/stingray/api/home/details/belowTheFold")("res")("body")("nearbyHomes")("homes") For i = 1 To 4 Debug.Print targetData(i)("listingStatus") Next i End Sub
调整说明
- 转义处理改用JS引擎直接序列化对象:通过ScriptControl执行JS的
JSON.stringify方法,自动处理所有转义符,输出标准JSON字符串送入解析,彻底解决转义错误问题。如果是64位Office环境无法使用ScriptControl,可以将转义处理代码替换为itemStr = Replace(Replace(itemStr, "\""", """"), "\\", "\")即可。 - 正则优化:增加非贪婪匹配和末尾换行校验,确保提取的对象字面量完整无多余字符。
- 增加匹配校验:避免正则匹配失败时的下标越界错误。
- 数据路径调整:根据Redfin当前的JSON结构,定位到附近房源的
listingStatus字段,遍历输出前4条即可得到预期结果。
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

