本文介绍如何从 html 页面的 `
在现代动态网页中,许多网站(尤其是使用前端框架渲染的站点)会将结构化数据(如新闻列表、产品信息)以 JavaScript 对象字面量的形式内联在
✅ 正确思路:精准提取 + 安全转换
核心原则是 不全局替换字符串(如 text.replace(‘null’, ‘None’)),因为 null 可能出现在 URL、文件名或正文内容中(如 “link”: “/path/to/null-report.pdf”),误替换将破坏数据。应采用「定位 → 截取 → 合法化」三步法:
- 定位目标 :用 BeautifulSoup 查找包含 App = 的 script 标签;
- 精准截取 JSON 片段:从 App = 后开始,提取首个完整 {…} 对象(需处理嵌套大括号);
- 转换为标准 JSON:将 JS 特有语法(null, true, false)映射为 JSON 兼容格式(null → null,注意:JSON 中 null 写法与 JS 一致,无需改为 None!⚠️关键纠正)。
? 重要澄清:JSON 规范本身支持 null、true、false(小写,无引号),与 Python 的 None/True/False 是不同语言的表示。json.loads() 要求输入是 字符串形式的标准 JSON,因此只需确保提取的字符串中:所有键和字符串值均用双引号包裹(JS 允许单引号或无引号键,JSON 不允许);null/true/false 已是合法 JSON 字面量,无需替换为 None/True/False(那是 Python 对象,不是 JSON 字符串);无 JS 注释、函数、变量声明等非法 JSON 内容。
实际网页中,App = {…}; 的 {…} 部分通常已是合法 JSON(键名被引号包裹,字符串值也带引号),唯一干扰是末尾的分号 ; 和可能的后续代码。因此,更健壮的提取方式是: