import io, re
# sweep에서 검출된 tab01 보유 페이지(앵커 URL) 추출
txt = io.open("_scan_out.txt", encoding="utf-8").read()
# 각 "rNN URL\n   [NEW/DUP] tab01 ... tabs=[...]" 블록
blocks = re.findall(r"r\d+ (https://www\.kofpi\.or\.kr\S+)\n\s*\[(NEW|DUP)\] tab01[^\n]*tabs=\[([^\n]*)\]", txt)
print("=== sweep가 검출한 tab01 페이지 (총 %d) ===" % len(blocks))
sweep_paths=set()
for url, mark, tabs in blocks:
    p = url.split("kofpi.or.kr")[1].split("?")[0]
    sweep_paths.add(p)
    ntabs = tabs.count("'/")  # rough
    print(f"  [{mark}] {p}  (탭링크≈{tabs.count('(')})")

# GROUPS에 들어간 앵커 leaf url들 (classify에 등재된 첫 href의 부모페이지가 아니라, 앵커행 자체)
# 대신 GROUPS 정의의 모든 href path prefix를 수집
import importlib.util
groups_src = io.open("_classify_all.py", encoding="utf-8").read()
m = re.search(r"GROUPS=\{(.*?)\n\}", groups_src, re.S)
gtxt = m.group(1)
group_hrefs = set(re.findall(r"\"(/[^\"]+\.do)\"", gtxt))
print("\n=== GROUPS(전개대상)에 포함된 앵커행 수: %d ===" % gtxt.count("["))

# sweep에서 나온 페이지 중 그 페이지 자체가 GROUPS의 앵커가 아닌 것 찾기
# 핵심: sweep 페이지 path가 GROUPS 어떤 href에도 안 나오면 = 통째 누락
print("\n=== ⚠️ sweep는 찾았지만 GROUPS에 없는(누락 의심) 페이지 ===")
for p in sorted(sweep_paths):
    # 이 페이지가 어떤 그룹의 탭 href로 등장하나? 혹은 앵커행 url인가?
    if p not in group_hrefs:
        print(f"  {p}")
