공공기관2 작업 중. _temp 몽타주(재생성가능)는 제외. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41 lines
2.1 KiB
Python
41 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import openpyxl, time, json, ssl, urllib.request, sys
|
|
from bs4 import BeautifulSoup
|
|
ctx=ssl.create_default_context();ctx.check_hostname=False;ctx.verify_mode=ssl.CERT_NONE
|
|
HDR={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124 Safari/537.36'}
|
|
def fetch(u): return urllib.request.urlopen(urllib.request.Request(u,headers=HDR),timeout=25,context=ctx).read()
|
|
|
|
wb=openpyxl.load_workbook('한국중부발전.xlsx');ws=wb.active
|
|
# find start row = 서울발전본부 사업장소개 content/31
|
|
start=None
|
|
for r in range(3,ws.max_row+1):
|
|
k=ws.cell(r,11).value
|
|
if k and '/content/31/' in str(k): start=r; break
|
|
print('start row',start,file=sys.stderr)
|
|
res={}
|
|
for r in range(start,ws.max_row+1):
|
|
k=ws.cell(r,11).value
|
|
if not k or 'komipo.co.kr' not in str(k) or '/content/' not in str(k): continue
|
|
try: soup=BeautifulSoup(fetch(str(k)),'html.parser')
|
|
except Exception as e: print('err',r,str(e)[:40],file=sys.stderr); time.sleep(0.4); continue
|
|
# in-page tabs: ul class has 'tab' (not tab_link), li>a with data-tab or href starting '#'
|
|
for ul in soup.find_all('ul'):
|
|
cls=' '.join(ul.get('class') or [])
|
|
if 'tab' not in cls or 'tab_link' in cls: continue
|
|
tabs=[]
|
|
for li in ul.find_all('li', recursive=False):
|
|
a=li.find('a')
|
|
if not a: continue
|
|
href=a.get('href','') or ''
|
|
dt=a.get('data-tab')
|
|
if dt or href.startswith('#'):
|
|
tabs.append(a.get('data-name') or a.get_text(strip=True))
|
|
if len(tabs)>=2:
|
|
res[r]={'b':ws.cell(r,2).value,'leaf':ws.cell(r,6).value or ws.cell(r,7).value or ws.cell(r,5).value,
|
|
'cls':cls,'tabs':tabs,'curM':ws.cell(r,13).value,'L':ws.cell(r,12).value,'url':str(k)}
|
|
time.sleep(0.6)
|
|
json.dump(res,open('inpage.json','w',encoding='utf-8'),ensure_ascii=False,indent=1)
|
|
for r,v in sorted(res.items(),key=lambda x:int(x[0])):
|
|
print(f"r{r} b{v['b']} L={v['L']} M{v['curM']}->({len(v['tabs'])}) [{v['cls']}] tabs={v['tabs']} {v['url'][:46]}")
|
|
print('인페이지탭 페이지수:',len(res))
|