网页抓取JSON解析报错:unexpected end of string问题排查
JSON解析报错:
unexpected end of string 排查与解决 错误原因分析
你遇到的这个报错,核心问题是抓取的内容包含未转义的特殊字符,导致JSON结构被破坏:
- 从DOM获取的
innerText可能包含换行符(\n)、制表符(\t)或者回车符,这些字符在JSON字符串中必须被转义,否则解析器会误认为字符串提前结束。 - 虽然你提供的示例JSON里只有单引号,但实际抓取时可能存在隐藏的控制字符(比如换行),或者单引号与其他字符的组合意外触发了解析错误。
- 另外你的
number字段代码里硬编码返回字符串"null",这不符合JSON规范(JSON的null是小写无引号的),不过这不是当前报错的直接原因,但也是需要修正的细节问题。
解决方法
要修复这个问题,我们需要对抓取到的文本内容做JSON转义处理,同时修正number字段的返回逻辑:
1. 转义content中的特殊字符
在获取content时,替换掉所有JSON不允许的控制字符,确保生成的字符串符合JSON格式要求:
let content = blocks[z].querySelector('._5pbx.userContent._3576') ? blocks[z].querySelector('._5pbx.userContent._3576').innerText .replace(/\\/g, '\\\\') // 转义反斜杠 .replace(/"/g, '\\"') // 转义双引号(如果内容中存在) .replace(/\n/g, '\\n') // 转义换行符 .replace(/\r/g, '\\r') // 转义回车符 .replace(/\t/g, '\\t') // 转义制表符 : null;
2. 修正number字段的返回逻辑
移除硬编码的字符串"null",让match方法自然返回null(当没有匹配到号码时),这样生成的JSON会使用合法的null值:
let number = blocks[z].querySelector('._5pbx.userContent._3576') ? blocks[z].querySelector('._5pbx.userContent._3576').innerText.replace(/\s/g, '').match(/((\+)33|0)[1-9](\d{2}){4}/g) : null;
3. 验证生成的JSON
修改代码后,你可以在生成result数组后,用JSON.stringify(result)来验证输出的JSON是否合法,再保存或使用。
额外提示
如果还是出现报错,可以把抓取到的content打印出来,检查是否有其他特殊字符(比如Unicode空白字符),可以进一步添加替换规则:
.replace(/[\x00-\x1F\x7F]/g, '') // 移除所有ASCII控制字符
内容的提问来源于stack exchange,提问作者Nicolas Vriak




