解析电商页面JS生成的产品数据时遭遇lexical error求助
解决电商页面JS对象转JSON解析失败的问题
问题根源
你遇到的核心问题是提取的内容并非标准JSON,而是JavaScript对象字面量,其中包含JSON规范不支持的语法:
|| ''这类JS逻辑短路表达式- 函数调用(如
_getAvailabilityText('lowStock')) - 属性名未用双引号包裹(虽部分宽松解析器兼容,但不符合JSON标准)
错误提示中的|| ""正是触发语法错误的直接原因——JSON解析器无法识别这种JS专属语法。
修复步骤与代码实现
我们需要先将JS对象转换为符合JSON规范的字符串,再进行解析:
library(stringr) library(jsonlite) # 假设json_data为你获取的原始JS代码字符串 raw_js_obj <- json_data %>% str_remove_all("\\n|\\t|\\s{2,}") %>% # 移除换行、制表符及多余空格 str_extract("(?<=products\\.push\\()(\\{.*?\\})(?=\\);)") # 提取products.push内的目标对象 # 处理1:移除所有 || '' 逻辑表达式,保留原始有效值 cleaned_str <- str_replace_all(raw_js_obj, "\\s*\\|\\|\\s*''", "") # 处理2:根据JS函数逻辑,替换固定返回值的函数调用 cleaned_str <- str_replace_all(cleaned_str, "_getAvailabilityText\\('lowStock'\\)", "'si'") cleaned_str <- str_replace_all(cleaned_str, "_getAvailabilityBinary\\('lowStock'\\)", "1") # 处理3:给所有属性名添加双引号,符合JSON键名规范 cleaned_str <- str_replace_all(cleaned_str, "(\\w+)\\s*:", '"\\1":') # 解析为JSON对象 ex_parsed_json <- parse_json(cleaned_str)
关键说明
- 移除
|| '':这是JS中处理空值的冗余逻辑,原始值本身已为字符串或空字符串,直接保留前半部分即可。 - 替换函数调用:页面内的
_getAvailabilityText和_getAvailabilityBinary是固定逻辑函数,可根据传入参数直接替换为返回值;若后续出现其他库存状态(如outOfStock),可扩展条件分支处理。 - 属性名加双引号:标准JSON要求所有键必须用双引号包裹,这一步是确保解析器正确识别结构的核心操作。
验证后的标准JSON格式
处理后的字符串会转化为如下合法JSON,可被jsonlite正常解析:
{ "id": "IME5401", "price": "22.99", "currency": "EUR", "name": "Imetec Living Air umidificatore Vapore 0,4 L 700 W Blu", "category": "Riscaldamento", "categoryId": "C7301", "group": "Riscaldamento", "tdId": "", "weight": "", "brand": "Imetec", "variant": "", "dimension55": "si", "metric5": 1, "dimension63": "", "metric12": "", "dimension10": "Piccoli e Grandi Elettrodomestici", "dimension11": "Trattamento Aria", "dimension66": "", "dimension62": "no-promo" }
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

