import requests, sys, re, json from bs4 import BeautifulSoup import urllib3 urllib3.disable_warnings() sys.stdout.reconfigure(encoding='utf-8') base = 'https://www.seocheon.go.kr' path = '/prog/ioCateData/kor/sub01_02_02/list.do' H = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'} def get(u): r = requests.get(u, headers=H, timeout=25, verify=False) r.encoding = r.apparent_encoding or 'utf-8' return r.text def total_of(soup): m = re.search(r'Total\s*:\s*([\d,]+)', soup.get_text()) return int(m.group(1).replace(',','')) if m else None def slave_list(soup): out=[] ul = soup.select_one('ul.slave_tab') if not ul: return out for li in ul.select('li'): a=li.find('a') if not a: continue txt=' '.join(li.get_text().split()) href=a.get('href','') cc=re.search(r'cate_cd=(\w+)', href) out.append((cc.group(1) if cc else '', txt, base+href)) return out # basic tabs soup0 = BeautifulSoup(get(base+path), 'html.parser') basics=[] for li in soup0.select('ul.basic_tab li'): a=li.find('a'); if not a: continue txt=' '.join(li.get_text().split()) href=a.get('href','') bc=re.search(r'cate_b_cd=(\w+)', href) basics.append((bc.group(1) if bc else '', txt, base+href)) result=[] for bcd, btxt, burl in basics: bsoup = BeautifulSoup(get(burl), 'html.parser') slaves = slave_list(bsoup) if not slaves: t = total_of(bsoup) result.append({'b':bcd,'btxt':btxt,'cate':'','ctxt':'','url':burl,'total':t}) print(f'{bcd} {btxt[:30]:30} | (no slave) Total={t}') else: for ccd, ctxt, curl in slaves: csoup = BeautifulSoup(get(curl), 'html.parser') t = total_of(csoup) result.append({'b':bcd,'btxt':btxt,'cate':ccd,'ctxt':ctxt,'url':curl,'total':t}) print(f'{bcd} {btxt[:24]:24} | {ccd} {ctxt[:18]:18} Total={t}') with open('_enum_result.json','w',encoding='utf-8') as f: json.dump(result,f,ensure_ascii=False,indent=2) print('TOTAL leaves:', len(result), 'sum:', sum((x['total'] or 0) for x in result))