#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""patch_jinyun.py —— 修缙云：正文容器 div.content + 清元数据行"""
import ast
import io
import os
import shutil
import sys

P = "/root/gov_crawler/crawl_jinyun_hjgs.py"
BAK = "/root/gov_crawler/Archive/crawl_jinyun_hjgs.py.bak_20260924_body"
src = io.open(P, encoding="utf-8").read()
n_ok = 0

# ① 正文容器
old1 = '''    for sel in ("div.content div.wenz", "div.wenz", "#zoom", "div.zwxl-content",
                "div.trs_editor_view", "div.article", "div.Article_Con"):'''
new1 = '''    # 缙云实测：正文在 div.content（其外层 barrierfree_container 含左侧导航+标题+索引号等元数据）
    for sel in ("div.content", "div.content div.wenz", "div.wenz", "#zoom",
                "div.trs_editor_view"):'''
if src.count(old1) == 1:
    src = src.replace(old1, new1); n_ok += 1
else:
    print("❌ 锚点① 命中 %d 次" % src.count(old1))

# ② 段落过滤器加「元数据行」清理（用户规范：元数据逐行必清）
old2 = '下一篇)\\s*[】\\]）)]?$", plain):\n            continue'
new2 = ('下一篇)\\s*[】\\]）)]?$", plain):\n            continue\n'
        '        # JPAAS 详情页元数据行（用户规范：页眉面包屑/元数据逐行必清）\n'
        '        if re.match(r"^(?:索引号|发布机构|发布时间|原文链接|政策解读链接|成文日期|主题分类|"\n'
        '                    r"体裁分类|发文字号|有效性|来源|作者|浏览次数)\\s*[：:]?\\s*$", plain):\n'
        '            continue\n'
        '        if re.match(r"^点击查看(?:源文件|政策解读)$", plain):\n'
        '            continue')
if src.count(old2) == 1:
    src = src.replace(old2, new2); n_ok += 1
else:
    print("❌ 锚点② 命中 %d 次" % src.count(old2))

if n_ok != 2:
    print("未全部命中，未落盘")
    sys.exit(1)
try:
    ast.parse(src)
except SyntaxError as e:
    print("❌ 语法错误，未落盘:", e)
    sys.exit(1)
os.makedirs(os.path.dirname(BAK), exist_ok=True)
if not os.path.exists(BAK):
    shutil.copy2(P, BAK)
io.open(P, "w", encoding="utf-8").write(src)
print("✅ 已修（备份 %s）" % BAK)
