You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

网页抓取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

火山引擎 最新活动