공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
82 lines
3.6 KiB
Python
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")
|