使用Python/js2xml解析含反引号的JavaScript报错求助
解决js2xml解析ES6模板字符串(反引号)报错的问题
问题根源
你使用的js2xml默认依赖calmjs.parse的ES5解析器,而反引号包裹的模板字符串是ES6新增语法,ES5解析器不支持该语法规则,因此触发语法错误。单纯给calmjs的字符列表添加反引号无法解决问题,因为这涉及到词法分析器的token识别、语法分析器的语法树构建等完整逻辑,不是仅添加字符就能覆盖的。
解决方案
方案1:临时替换反引号(快速解决,适合简单场景)
如果你的JS代码里模板字符串没有用到ES6插值功能(比如${变量}),可以直接将所有反引号替换成双引号,再交给js2xml解析:
# 替换所有反引号为双引号 course_admin_js = course_admin_js.replace('`', '"') # 执行解析 course_admin_parsed = js2xml.parse(course_admin_js)
方案2:改用ES6解析器(推荐,支持完整ES6模板字符串)
calmjs.parse本身提供了ES6解析器,你可以指定js2xml使用该解析器处理带反引号的代码:
from calmjs.parse.parsers.es6 import Parser import js2xml # 初始化ES6解析器实例 es6_parser = Parser() # 调用parse时指定parser参数 course_admin_parsed = js2xml.parse(course_admin_js, parser=es6_parser)
这个方法能完整识别ES6模板字符串,包括插值语法,不会破坏原代码结构。
方案3:转译ES6到ES5(复杂场景备用)
如果上述方案不适用,可先将ES6代码转译为ES5再解析,比如用babelpy调用Babel完成转译:
from babelpy import Babel # 初始化Babel,指定转译目标为ES5 babel = Babel(targets={"ie": "11"}) # 转译JS代码 es5_js = babel.transform(course_admin_js) # 解析转译后的ES5代码 course_admin_parsed = js2xml.parse(es5_js)
内容的提问来源于stack exchange,提问作者MrMills
相关产品推荐
相关产品推荐

