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