
本文介绍如何绕过前端渲染限制,通过正则匹配从网页 标签中精准提取内嵌的 JSON 数据,并将其结构化为 Pandas DataFrame,适用于 CoreLogic 等采用“脚本注入数据”模式的房地产数据页面。
本文介绍如何绕过前端渲染限制,通过正则匹配从网页 `<script>` 标签中精准提取内嵌的 json 数据,并将其结构化为 pandas dataframe,适用于 corelogic 等采用“脚本注入数据”模式的房地产数据页面。</script>
许多现代数据展示型网站(如 CoreLogic 澳大利亚近期成交平台)并不将表格内容直接写入 HTML DOM,而是通过 <script> 标签内联一段 JavaScript 代码(例如 var postcodeData = {...}),由前端框架动态渲染表格。这意味着传统基于 BeautifulSoup.find('table') 的静态解析会失败——因为 HTML 中根本不存在 <table> 元素。</script>
针对此类场景,核心思路是:定位并提取脚本中赋值给特定变量(如 postcodeData)的原始 JSON 字符串,再反序列化为 Python 对象。由于该数据未经过 API 鉴权、纯前端使用,通常可直接获取(无需 Selenium 或登录)。
以下为完整可运行的解决方案:
import json
import re
import requests
import pandas as pd
url = "https://www.corelogic.com.au/our-data/recent-sales?postcode=5600"
# 发起请求(注意:部分站点可能校验 User-Agent,建议添加)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
response.raise_for_status() # 抛出网络错误
# 使用正则精准捕获 postcodeData = { ... } 中的 JSON 对象(含嵌套结构)
# 注意:.*? 是非贪婪匹配,}; 确保匹配到完整对象结尾
match = re.search(r'postcodeData\s*=\s*(\{[^}]*\});', response.text)
if not match:
raise ValueError("Failed to locate 'postcodeData' variable in script")
# 提取并解析 JSON
data_dict = json.loads(match.group(1))
# 结构分析:data_dict['data'] 是列表,每个元素含 'properties' 字段(即一条销售记录)
# 示例:data_dict['data'][0]['properties'] → {'address': '123 Main St', 'price': 850000, ...}
df = pd.DataFrame(data_dict['data'][0]['properties'])
print(f"成功提取 {len(df)} 列字段,前 3 行示例:")
print(df.head(3))✅ 关键要点说明:
立即学习“Java免费学习笔记(深入)”;
- 避免 403 错误:原问题中 urllib.request.urlopen() 缺少 User-Agent 头,易被服务器拦截;requests + 自定义 headers 更健壮;
- 正则更鲁棒:r'postcodeData\s*=\s*(\{[^}]*\});' 可处理空格、换行及简单嵌套(若 JSON 含多层 {},需升级为 json.loads(re.search(r'postcodeData\s*=\s*(\{.*?\});', ...).group(1)) 配合 re.DOTALL);
- 数据结构验证:实际响应中 data_dict['data'] 是长度为 1 的列表(含全部 90 条记录),每条记录位于 item['properties'];若未来结构变更,建议先打印 data_dict.keys() 和 type(data_dict['data']) 调试;
- 扩展性提示:如需批量抓取多个邮编,可封装函数并加入异常重试、延迟及请求频率控制,符合 robots.txt 与网站使用条款。
该方法轻量、高效,不依赖浏览器自动化,是解析“伪静态”JavaScript 内联数据的标准实践。










