DB_JOB/작업파일/공공기관2/_hf_rebuild.py
hehihoho3 df16c98366 백업: DB수집 전체 스냅샷 (공공기관2 정리 전)
공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 18:15:40 +09:00

82 lines
3.6 KiB
Python

# -*- coding: utf-8 -*-
"""주택금융: 현재 시트→depth 트리 읽기 → 정보목록 3보드에 분류 카테고리 노드 삽입
→ _gnb\5.json 저장(이후 _gnb_write 5 + phase234로 재구성). 구조 보존+카테고리 추가."""
import sys, io, os, glob, json, re
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
import openpyxl
BASE = r"D:\01.프로젝트\DB수집\작업파일\공공기관2"
fp = [x for x in glob.glob(os.path.join(BASE, "5.*", "*.xlsx")) if "_backup" not in x and "~$" not in x][0]
COLS = list(range(4, 11)) # D..J
ws = openpyxl.load_workbook(fp).active
# 마지막 데이터행
endr = 2
for r in range(3, ws.max_row+1):
if ws.cell(r,2).value is not None or any(ws.cell(r,c).value for c in COLS) or ws.cell(r,11).value:
endr = r
# 시트 → 노드(depth,label,href) : diff기반(레벨 바뀌면 노드 emit, 리프만 href)
last = {c: None for c in COLS}
prev = {c: None for c in COLS}
nodes = []
for r in range(3, endr+1):
for c in COLS:
v = ws.cell(r,c).value
if v not in (None,''):
last[c] = v
for cc in COLS:
if cc > c: last[cc] = None
eff = {c: last[c] for c in COLS}
leafcols = [c for c in COLS if eff[c] not in (None,'')]
if not leafcols:
continue
leafcol = max(leafcols)
href = ws.cell(r,11).value or ''
# prev와 비교해 처음 달라지는 깊이부터 leaf까지 노드 emit
diff_from = None
for c in COLS:
if c > leafcol: break
if eff[c] != prev.get(c):
diff_from = c; break
if diff_from is None:
diff_from = leafcol # 동일하면 leaf만(중복 방지용)
for c in range(diff_from, leafcol+1):
if eff[c] in (None,''): continue
nodes.append({'depth': c-3, 'label': eff[c], 'href': href if c==leafcol else ''})
prev = dict(eff)
print("원본 노드", len(nodes))
# 카테고리 데이터
CATS = {
"sub06_04_01": ([("감사","24"),("윤리","25"),("기획","26"),("재정","27"),("법무","28"),("노무","29"),
("인사","30"),("총무","31"),("회계","32"),("정보화","33"),("홍보","34"),("대외","35")], "표준정보목록"),
"sub06_04_02": ([("주택구입","36"),("주택보증","37"),("주택연금","38"),("유동화증권","39"),("신용회복","40"),("재무","41"),("기타","42")], "고유정보목록"),
"sub06_04_03": ([("감사","24"),("윤리","25"),("기획","26"),("재정","27"),("법무","28"),("노무","29"),
("인사","30"),("총무","31"),("회계","32"),("정보화","33"),("홍보","34"),("대외","35")], "즐겨찾는목록"),
}
def board_key(href):
m = re.search(r'(sub06_04_0[123])', href or '')
return m.group(1) if m else None
# 노드 순회하며 해당 보드 leaf 노드 뒤에 카테고리(depth+1) 삽입
new = []
for nd in nodes:
new.append(nd)
bk = board_key(nd['href'])
if bk in CATS and 'srCategoryId' not in nd['href']:
cats, lbl = CATS[bk]
# 라벨도 일치해야(자주찾는정보 r144 같은 동일URL 중복행엔 안 넣음)
if nd['label'] == lbl:
base = nd['href'].split('?')[0]
for nm, cid in cats:
new.append({'depth': nd['depth']+1, 'label': nm, 'href': f"{base}?mode=list&srCategoryId={cid}"})
print(f" {lbl}(d{nd['depth']}) +{len(cats)} 카테고리")
print("최종 노드", len(new))
out = {'num':5, 'name':'한국주택금융공사', 'base':'https://www.hf.go.kr', 'gnb': new}
json.dump(out, open(os.path.join(BASE,'_gnb','5.json'),'w',encoding='utf-8'), ensure_ascii=False, indent=1)
print("saved _gnb/5.json")