Python提取HTML中window.__INITIAL_STATE__内容并解析为JSON
问题原因
re.search()返回值是正则匹配对象(Match类型),并非匹配到的文本内容,直接传入json.loads()必然触发类型报错- 你看到的
\u002F是JSON标准中对斜杠/的转义写法,不属于字节/字符串混合异常,JSON解析器可自动识别处理,无需额外手动替换 - 原正则
(.*?);采用非贪婪匹配,遇到JSON内容中第一个分号就会停止匹配,截取的JSON片段不完整,无法正常解析;同时原正则未开启跨行匹配模式,无法匹配跨多行的JSON内容
修复代码
import re import json import requests # 模拟浏览器请求头,避免被站点反爬策略拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } url = "https://zum.com/" resp = requests.get(url, headers=headers, timeout=10) resp.encoding = resp.apparent_encoding html_doc = resp.text # 开启re.S模式让.匹配换行符,捕获完整JSON结构,兼容末尾分号、空白符等场景 match_result = re.search( r"window\.__INITIAL_STATE__\s*=\s*(\{.*?\})\s*;?\s*</script>", html_doc, flags=re.S ) if match_result: json_content = match_result.group(1) # 直接解析即可,所有转义字符会自动还原 parsed_data = json.loads(json_content) # 测试输出:打印第一条股指数据 print(parsed_data["headerStore"]["tickers"]["items"][0]) else: raise ValueError("页面中未找到__INITIAL_STATE__数据")
关键说明
- 解析完成后所有
\u002F会自动还原为正常的/,URL可直接使用,无需额外转义处理 - 如果后续遇到JSON结构更复杂、正则容易截断的场景,可以改用宽松JSON解析库,或者用脚本执行引擎提取变量,当前场景用上述正则已经足够稳定
- 若请求返回内容乱码,可手动指定
resp.encoding = "utf-8"适配站点编码
内容的提问来源于stack exchange,提问作者KimGyeongMin-KR
相关产品推荐
相关产品推荐

