공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
59 lines
2.5 KiB
Python
59 lines
2.5 KiB
Python
"""5차: 부안/완주/군산/순창 인라인 메가메뉴 중첩 구조 정밀 덤프."""
|
|
import re, warnings
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
warnings.filterwarnings('ignore')
|
|
UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
|
def fetch(url, t=20):
|
|
r = requests.get(url, timeout=t, verify=False, headers={'User-Agent': UA})
|
|
meta = re.search(rb'<meta[^>]*charset=["\']?\s*([\w-]+)', r.content[:4096], re.I)
|
|
r.encoding = meta.group(1).decode('ascii','ignore') if meta else r.apparent_encoding
|
|
return r
|
|
|
|
def tree(el, depth=0, maxd=4, maxchild=6):
|
|
if el is None or depth > maxd: return
|
|
kids = el.find_all(recursive=False)
|
|
for i, c in enumerate(kids):
|
|
if i >= maxchild and depth >= 1:
|
|
print(' '*(depth+1) + '...'); break
|
|
cls = '.'.join(c.get('class', []))
|
|
a = c.find('a', recursive=False)
|
|
atxt = a.get_text().strip()[:18] if a else ''
|
|
ah = (a.get('href') or '')[:55] if a else ''
|
|
print(' '*(depth+1) + f'{c.name}.{cls}' + (f' a={atxt!r} {ah}' if atxt else ''))
|
|
tree(c, depth+1, maxd, maxchild)
|
|
|
|
print('############ 부안 nav#onmenu ############')
|
|
soup = BeautifulSoup(fetch('https://www.buan.go.kr/index.buan?contentsSid=1').text, 'html.parser')
|
|
nav = soup.select_one('nav#onmenu')
|
|
# 첫 1~2개 top li만
|
|
if nav:
|
|
top = nav.find('ul')
|
|
print('nav>ul 첫 li 2개:')
|
|
for li in (top.find_all('li', recursive=False)[:2] if top else []):
|
|
tree(li, 0, 4, 5)
|
|
print(' ----')
|
|
|
|
print('\n############ 완주 div.top_menu_wrap ############')
|
|
soup = BeautifulSoup(fetch('https://www.wanju.go.kr/index.9is').text, 'html.parser')
|
|
w = soup.select_one('div.top_menu_wrap')
|
|
tree(w, 0, 3, 4)
|
|
|
|
print('\n############ 군산 첫 allmenubox ############')
|
|
soup = BeautifulSoup(fetch('https://www.gunsan.go.kr/main').text, 'html.parser')
|
|
pc = soup.select_one('div#all_pcmenu')
|
|
if pc:
|
|
boxes = pc.select('div.allmenubox')
|
|
print(f'allmenubox 수: {len(boxes)}')
|
|
b = boxes[0]
|
|
print('Bmenu(대분류):', repr((b.find('a', class_='Bmenu') or b.find('a')).get_text().strip()[:20]))
|
|
tree(b, 0, 4, 5)
|
|
|
|
print('\n############ 순창 ul.gnb ############')
|
|
soup = BeautifulSoup(fetch('https://www.sunchang.go.kr/').text, 'html.parser')
|
|
g = soup.select_one('ul.gnb')
|
|
if g:
|
|
print(f'ul.gnb 직계 li: {len(g.find_all("li", recursive=False))}')
|
|
for li in g.find_all('li', recursive=False)[:1]:
|
|
tree(li, 0, 4, 5)
|