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}")