如何提取HTML脚本中REA JS变量并转换为标准JSON格式
内嵌script标签中REA房产数据转JSON可靠方案
不要用正则逐行匹配的方案,这类方案对JS嵌套对象、数组、转义字符、换行拆分的代码容错性极差,只要源码里出现字符串包含赋值关键字、嵌套层级调整就会解析失败,维护成本极高。
具体实现流程
- 提取目标script标签内容
用标准HTML解析器定位id="P4EPconfig"的script标签,直接读取标签内部的纯JS文本,不要用正则切割HTML,避免标签注释、属性变体干扰提取结果。
Python环境示例代码:from bs4 import BeautifulSoup # 传入待解析的完整HTML字符串 soup = BeautifulSoup(html_raw, "html.parser") script_text = soup.find("script", id="P4EPconfig").string - 沙箱执行JS片段捕获REA对象
不需要手动实现JS语法解析,直接在隔离的JS运行时中执行提取到的脚本,提前在上下文中声明REA占位对象,执行完成后就能拿到完整的结构化数据,完全兼容所有JS合法语法,不管是直接整体赋值REA对象、逐行挂载属性、还是给window.REA赋值都能正常捕获。
Python环境可使用js2py实现,示例代码:import js2py # 初始化隔离上下文,提前声明占位对象 js_context = js2py.EvalJs() js_context.execute("var REA = {}; var window = {REA: REA};") # 执行脚本内容,所有REA相关赋值会自动写入上下文 js_context.execute(script_text) # 转换为Python原生字典结构 rea_result = js_context.REA.to_dict()若脚本中包含DOM操作、浏览器API调用逻辑,只需要在上下文中提前mock掉document、navigator等浏览器对象即可,不需要修改原始脚本内容。
- 序列化输出标准JSON
拿到原生结构化对象后,直接用标准JSON序列化工具输出即可,最终输出的嵌套结构和源码中REA的属性结构完全一致,包含房产ID、区位信息、坐标、房源图、户型参数、土地面积、估值、交易趋势等所有挂载字段,不需要提前做字段映射。
示例代码:import json # 输出格式化后的标准JSON文件 with open("rea_data.json", "w", encoding="utf-8") as f: json.dump(rea_result, f, ensure_ascii=False, indent=2)
方案对比正则的优势
- 容错性强:支持任意层级的对象、数组嵌套,自动处理字符串转义、换行拆分的代码逻辑,不会出现漏匹配、错切结构的问题
- 维护成本低:不需要针对不同字段写单独的匹配规则,不需要适配源码的格式调整,核心代码仅十余行
- 字段无遗漏:REA对象下所有层级的属性都会被完整提取,不需要提前枚举字段名
内容的提问来源于stack exchange,提问作者CTK
相关产品推荐
相关产品推荐

