공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
2.2 KiB
Python
49 lines
2.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# 단양 트리: ul.ld1>li.cd1>a.l1(d1) / div.lb1>ul.ld2>li.cd2>a.l2(d2) / ul.ld3>a.l3(d3) / ul.ld4>a.l4(d4)
|
|
import sys,io,json,urllib.request,ssl
|
|
from bs4 import BeautifulSoup
|
|
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
|
|
ctx=ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
|
|
def get(u):
|
|
req=urllib.request.Request(u,headers={'User-Agent':'Mozilla/5.0'})
|
|
return urllib.request.urlopen(req,timeout=25,context=ctx).read().decode('utf-8','ignore')
|
|
h=get('https://www.danyang.go.kr/dy21/98')
|
|
s=BeautifulSoup(h,'html.parser')
|
|
def txt(a): return a.get_text(strip=True) if a else ''
|
|
def khint(a):
|
|
c=' '.join(a.get('class') or []); href=a.get('href') or ''
|
|
if href.startswith('http') and 'danyang.go.kr' not in href: return '사이트'
|
|
if 'menutype_modules_board' in c: return '게시판'
|
|
if 'menutype_outlink' in c: return '사이트'
|
|
return '페이지'
|
|
def kids(li, sub_ul, a_cls):
|
|
# li 바로 아래 div>ul.sub_ul > li 들의 a.a_cls
|
|
out=[]
|
|
for ul in li.find_all('ul', class_=sub_ul):
|
|
# 가장 가까운 ul만 (직계 div 하위)
|
|
for cli in ul.find_all('li', recursive=False):
|
|
a=cli.find('a', class_=a_cls) or cli.find('a', recursive=False)
|
|
if a: out.append((cli,a))
|
|
break
|
|
return out
|
|
tree=[]
|
|
root=s.select_one('ul.ld1')
|
|
for li1 in root.find_all('li', recursive=False):
|
|
a1=li1.find('a', recursive=False); d1=txt(a1)
|
|
if d1=='메인': continue
|
|
k2=kids(li1,'ld2','l2')
|
|
if not k2: tree.append([d1,'','','',a1.get('href'),khint(a1)]); continue
|
|
for li2,a2 in k2:
|
|
d2=txt(a2)
|
|
k3=kids(li2,'ld3','l3')
|
|
if not k3: tree.append([d1,d2,'','',a2.get('href'),khint(a2)]); continue
|
|
for li3,a3 in k3:
|
|
d3=txt(a3)
|
|
k4=kids(li3,'ld4','l4')
|
|
if not k4: tree.append([d1,d2,d3,'',a3.get('href'),khint(a3)])
|
|
else:
|
|
for li4,a4 in k4: tree.append([d1,d2,d3,txt(a4),a4.get('href'),khint(a4)])
|
|
json.dump(tree,open('_dy_tree.json','w',encoding='utf-8'),ensure_ascii=False)
|
|
print('단양 트리노드',len(tree))
|
|
for t in tree[:5]: print(' ',t[0],'>',t[1],'>',t[2],'>',t[3],'|',(t[4] or '')[:35])
|