最直接方法是用re.search()精准匹配内联js变量,如re.search(r'var\s+data\s=\s({.*?});', html, re.dotall),再用ast.literal_eval()安全解析;需先替换null/true/false为none/true/false,优先用beautifulsoup定位script标签以避免误匹配。

用 re.search() 提取单个内联 JS 变量最直接
如果目标明确(比如只取 window.config 或 var data = {...}),正则匹配是最快路径。关键不是写“通用解析器”,而是精准锚定变量声明位置。
常见错误是用 re.findall(r'var\s+data\s*=\s*(.*?);', html) —— 这会因换行、注释、嵌套括号直接失效。正确做法是用 re.DOTALL 并匹配完整 JSON 结构:
- 先用
re.search(r'var\s+data\s*=\s*({[^}]*?});', html, re.DOTALL)尝试,但仅适用于无嵌套大括号的简单对象 - 更稳妥的是锚定到赋值后第一个分号前的完整 JSON 字符串:
re.search(r'var\s+data\s*=\s*({.*?});', html, re.DOTALL),再用json.loads()解析 - 若含单引号或未转义引号,先替换:
json_str.replace("'", '"').replace('""', '"')(需谨慎,避免误替换内容)
遇到多层嵌套或动态拼接时,ast.literal_eval() 比 json.loads() 更鲁棒
很多前端代码用单引号、省略逗号、尾部逗号、甚至 true/false 而非 True/False,这时 json.loads() 会报 JSONDecodeError。而 ast.literal_eval() 是 Python 自带的安全求值器,能处理类 Python 字面量语法。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 适用场景:变量值是字典、列表、字符串、数字、
null(需先替换为None)、true/false(替换为True/False) - 必须预处理:
js_code = js_code.replace('null', 'None').replace('true', 'True').replace('false', 'False') - 然后调用:
ast.literal_eval(js_code)—— 它拒绝执行任意代码,比eval()安全得多 - 注意:不能处理函数、undefined、变量引用(如
var x = y中的y)
当变量在 <script></script> 标签里且混着其他 JS 逻辑时,先用 BeautifulSoup 定位再提取
直接在整个 HTML 上跑正则容易误匹配到外部脚本或注释里的相似文本。应该先用 BeautifulSoup 锁定内联 <script></script> 块,再对每个块单独处理。
- 用
soup.find_all('script', string=re.compile(r'var\s+data\s*='))找出可能含目标的 script 标签 - 对每个匹配到的
script.string再执行前述正则 +ast.literal_eval()流程 - 若
script.string为None(比如含 CDATA 或压缩代码),改用script.get_text() - 避免用
html.parser处理含未闭合标签的混乱 HTML;推荐lxml或html5lib解析器
exec() 不推荐,但小范围可控场景下可临时绕过语法差异
极少数情况(比如变量值含模板字符串、计算属性、ES6+ 语法),连 ast.literal_eval() 都无法处理。此时可构造最小作用域,用 exec() 执行并提取变量——但必须确保输入完全可信,且只执行一次。
- 示例:
namespace = {}; exec('data = {"a": 1};', namespace); result = namespace["data"] - 绝不能把整段 script 丢进去;应先用正则切出
data = ...这一行或几行 - 禁止传入用户可控内容;该方法仅限离线分析已知静态 HTML
- 性能差、不安全、难调试,是兜底手段,不是首选
真正麻烦的从来不是提取动作本身,而是变量定义方式千奇百怪:有的在 IIFE 里,有的靠 document.write 注入,有的用 Object.assign 拼接。先确认变量是否真在 HTML 源码里可见,再决定用正则锚定还是模拟浏览器环境执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










