from selectolax.parser import HTMLParser import os def test_list_parsing(): print("=== 리스트 파싱 테스트 ===") path = "d:\\py_train\\voc_noti\\test\\sample_list.html" if not os.path.exists(path): print("샘플 파일이 없습니다.") return with open(path, "r", encoding="utf-8") as f: html = f.read() tree = HTMLParser(html) rows = tree.css("tr[bgcolor='#ffffff']") print(f"발견된 행 개수: {len(rows)}") for i, row in enumerate(rows): cols = row.css("td") if len(cols) < 7: continue voc_id = cols[0].text(strip=True) channel = cols[1].text(strip=True) # 제목: a 태그의 title 속성 우선 title_a = cols[2].css_first("a") title_full = title_a.attributes.get("title", "") if title_a else "" if not title_full and title_a: title_full = title_a.text(strip=True) title_display = cols[2].text(strip=True) # 화면에 보이는 제목 writer = cols[3].text(strip=True) is_public_txt = cols[5].text(strip=True) status = cols[6].text(strip=True) print(f"[{i+1}] ID: {voc_id} | 채널: {channel} | 이름: {writer} | 공개: {is_public_txt} | 상태: {status}") print(f" 제목(표시): {title_display}") print(f" 제목(전체): {title_full}") print("-" * 47) def test_detail_parsing(): print("\n=== 상세 파싱 테스트 ===") path = "d:\\py_train\\voc_noti\\test\\sample_content.html" if not os.path.exists(path): print("샘플 파일이 없습니다.") return with open(path, "r", encoding="utf-8") as f: html = f.read() tree = HTMLParser(html) data = {} # 라벨 기반 데이터 추출 labels = tree.css("td[bgcolor='#E0EDEF']") for label in labels: key = label.text(strip=True) # 부모 tr에서 인덱스 찾기로 형제 td 접근 (model.py와 동일 로직) parent = label.parent if not parent: continue tds = parent.css("td") idx = -1 for i, td in enumerate(tds): if td == label: idx = i break if idx != -1 and idx + 1 < len(tds): val_node = tds[idx+1] # 응답구분 특별 처리 if "응답구분" in key: checked = val_node.css_first("input[checked]") if checked: val = checked.attributes.get('value') # 샘플 기준 매핑 mapping = {'1':'게시판', '2':'우편', '3':'팩스', '4':'전화', '5':'E-mail', '6':'기타'} val_txt = mapping.get(val, f"알수없음({val})") else: # 체크된게 없으면 텍스트라도 가져오기 val_txt = val_node.text(strip=True) else: # 줄바꿈 보존 (model.py와 동일 로직) val_txt = val_node.text(separator="\n", strip=True) data[key] = val_txt print("추출된 데이터:") for k, v in data.items(): print(f"[{k}]:\n{v}\n") if __name__ == "__main__": test_list_parsing() test_detail_parsing()