本文介绍如何使用 Python 从保存 HTML 源码的 .txt 文件中精准提取 JavaScript 中嵌入的 JSON 数据(如 quickviews.push({...})),并安全解析出目标字段(如 "usage" 的值),避免正则硬匹配或字符串切片带来的脆弱性。
本文介绍如何使用 python 从保存 html 源码的 .txt 文件中精准提取 javascript 中嵌入的 json 数据(如 `quickviews.push({...})`),并安全解析出目标字段(如 `"usage"` 的值),避免正则硬匹配或字符串切片带来的脆弱性。
在网页抓取与静态分析场景中,常需从本地保存的 HTML 文件(如 .txt 或 .html)中提取动态注入的结构化数据——这类数据通常以 JSON 格式嵌入在 <script> 标签内的 JavaScript 调用中(例如 quickviews.push({...}))。直接对 HTML 字符串进行索引定位(如 line.find('"usage":'))极易因格式变动、空格缩进、换行或转义字符而失效;更健壮的做法是:识别并提取完整的 JSON 片段,再交由标准 JSON 解析器处理。
以下为推荐实现方案,基于正则表达式定位 quickviews.push(...) 调用,并利用 json.loads() 安全解析:
import re
import json
def extract_usage_from_html_txt(filepath: str) -> str:
"""
从 HTML 源码文本文件中提取 quickviews.push() 内的 'usage' 字段值
Args:
filepath: .txt 文件路径,内容为包含 <script> 块的 HTML 源码
Returns:
usage 字符串(如 "188,426 mi"),若未找到则返回 None
"""
with open(filepath, 'rt', encoding='utf-8') as f:
for line in f:
# 使用非贪婪匹配捕获 quickviews.push(...) 中的 JSON 对象(不含外层括号)
match = re.search(r'quickviews\.push\(\s*(\{.*?\})\s*\);precheckCompare', line, re.DOTALL)
if match:
try:
# 解析提取出的 JSON 字符串为 Python 字典
data = json.loads(match.group(1))
return data.get('usage')
except (json.JSONDecodeError, KeyError, TypeError) as e:
print(f"JSON 解析失败或缺少 'usage' 字段: {e}")
return None
return None
# 使用示例
usage_value = extract_usage_from_html_txt('first_truck_source.txt')
if usage_value:
print(f"提取到里程信息: {usage_value}") # 输出: 提取到里程信息: 188,426 mi
else:
print("未在文件中找到有效的 usage 字段")✅ 关键优势说明:
- re.DOTALL 标志确保 . 可匹配换行符,适应多行 JSON;
- \s* 处理可能存在的空白符(空格、制表符、换行);
- json.loads() 严格校验 JSON 语法,自动处理转义、Unicode、嵌套结构等,远比手动 split() 或 find() + 切片可靠;
- 封装为函数便于复用,并加入异常处理与清晰反馈。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 若 HTML 中存在多个 quickviews.push() 调用,上述代码仅返回第一个匹配项中的 usage;如需全部,可将 return 改为 yield 并用生成器遍历;
- 确保文件编码为 UTF-8(添加 encoding='utf-8' 参数),避免中文或特殊符号解析错误;
- 生产环境建议配合 BeautifulSoup 预先定位 <script> 标签内容,再对脚本体执行正则,进一步提升鲁棒性。
总结:面对 HTML 文本中嵌入的结构化数据,应优先利用其原始格式(JSON/JavaScript Object)的语义特性,而非将其降级为纯字符串处理。通过“定位 → 提取 → 解析”三步法,即可高效、稳定地获取目标字段,这是 Web 数据提取工程实践中的重要范式。



















