공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
"""Find sitemap containers in 부여군 main page and 아산시 desktop GNB."""
|
|
import 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'
|
|
H = {'User-Agent': UA}
|
|
|
|
|
|
def fetch(url):
|
|
r = requests.get(url, headers=H, timeout=15, verify=False, allow_redirects=True)
|
|
r.encoding = r.apparent_encoding
|
|
return r.url, r.text
|
|
|
|
|
|
def outline(el, depth=0, max_lines=120, lines=None):
|
|
if lines is None:
|
|
lines = []
|
|
if len(lines) >= max_lines:
|
|
return lines
|
|
name = el.name
|
|
cls = ' '.join(el.get('class', []))
|
|
eid = el.get('id', '')
|
|
label = name
|
|
if eid:
|
|
label += f'#{eid}'
|
|
if cls:
|
|
label += '.' + cls.replace(' ', '.')
|
|
if name == 'a':
|
|
txt = el.get_text(strip=True)[:50]
|
|
href = el.get('href', '')[:80]
|
|
lines.append(' ' * depth + f'{label} "{txt}" → {href}')
|
|
else:
|
|
lines.append(' ' * depth + label)
|
|
for c in el.find_all(recursive=False):
|
|
if c.name in ('script', 'style'):
|
|
continue
|
|
outline(c, depth + 1, max_lines, lines)
|
|
if len(lines) >= max_lines:
|
|
return lines
|
|
return lines
|
|
|
|
|
|
# 부여군 — scan ALL container types for menu-like content
|
|
print('=== 부여군: scan all containers ===')
|
|
real, html = fetch('https://www.buyeo.go.kr/html/kr/')
|
|
soup = BeautifulSoup(html, 'html.parser')
|
|
# Find divs with most anchors
|
|
candidates = []
|
|
for d in soup.find_all(['div', 'nav', 'ul']):
|
|
a_count = len(d.find_all('a'))
|
|
if a_count >= 100:
|
|
cls = ' '.join(d.get('class', []))
|
|
eid = d.get('id', '')
|
|
candidates.append((a_count, d.name, eid, cls, d))
|
|
candidates.sort(reverse=True, key=lambda x: x[0])
|
|
for ac, name, eid, cls, _ in candidates[:10]:
|
|
print(f' {name}#{eid}.{cls[:60]} a={ac}')
|
|
|
|
# Outline top container
|
|
if candidates:
|
|
print('\n Top container outline:')
|
|
for line in outline(candidates[0][4], max_lines=60):
|
|
print(' ', line)
|
|
|
|
# 아산시 — desktop GNB
|
|
print('\n\n=== 아산시: desktop GNB ===')
|
|
real, html = fetch('https://www.asan.go.kr/main/')
|
|
soup = BeautifulSoup(html, 'html.parser')
|
|
# Look for desktop GNB sub-lists
|
|
for el in soup.select('[id^=mGnb-anchor], .gnb-sub-list, .submenu-wrap, .gnb-wrap'):
|
|
ac = len(el.find_all('a'))
|
|
if ac >= 30:
|
|
cls = ' '.join(el.get('class', []))
|
|
eid = el.get('id', '')
|
|
print(f' {el.name}#{eid}.{cls} a={ac}')
|
|
|
|
# Try the main desktop nav specifically
|
|
el = soup.select_one('nav.krds-gnb:not(#mobile-nav)')
|
|
if el:
|
|
print('\n Desktop nav outline:')
|
|
for line in outline(el, max_lines=80):
|
|
print(' ', line)
|