1. 개요
Kanna는 Swift 언어 기반의 HTML/XML 파싱 라이브러리로, iOS/macOS 애플리케이션에서 웹 크롤링 또는 데이터 추출 작업을 효율적으로 수행할 수 있도록 설계됨. Apple의 Foundation 프레임워크에 내장된 XMLParser
보다 직관적이며, XPath 및 CSS Selector 기반의 파싱을 지원함.
- 프로젝트명: Kanna
- 지원 플랫폼: iOS, macOS
- 주요 기능: XPath 및 CSS3 Selector 지원, HTML/XML 파싱
- 라이선스: MIT License
- 기반 라이브러리: libxml2 (C 기반)
2. 기술적 특징
항목 | 내용 |
---|---|
파서 엔진 | C 기반 libxml2 |
언어 | Swift (Objective-C 연동 가능) |
파싱 대상 | HTML 4.x/5.x, XHTML, XML 1.0 |
선택자 지원 | XPath, CSS |
오류 내성 | HTML 파싱 시 비표준 문서에 대한 내성 있음 |
동기/비동기 | 동기적 처리 중심 (네트워크 요청은 별도 필요) |
2.1 XPath 예시
if let doc = try? HTML(html: htmlString, encoding: .utf8) {
for node in doc.xpath("//a[@href]") {
print(node.text)
}
}
2.2 CSS Selector 예시
if let doc = try? HTML(html: htmlString, encoding: .utf8) {
for link in doc.css("a.link") {
print(link["href"])
}
}
3. 구조 및 내부 동작
3.1 파싱 절차
HTML()
혹은XML()
객체로 Raw 문자열 입력- 내부적으로 libxml2 파서 호출
- 노드 트리 구조 생성
- XPath 혹은 CSS Selector로 탐색 가능
XMLElement
객체로 결과 리턴
3.2 의존성
- Swift Package Manager, CocoaPods, Carthage 지원
libxml2
를 링크해야 하며,-lxml2
플래그 설정 필요
4. 장단점 분석
✅ 장점
- 간결한 문법: XPath/CSS Selector 모두 지원
- Swift 친화적: 타입 안정성과 Swift 스타일 API 제공
- libxml2 기반: 빠르고 안정적인 파싱 성능
❌ 단점
- 비동기 지원 미흡: 네트워크 연동은 별도 구현 필요
- 메모리 사용량: 대규모 HTML 파싱 시 성능 이슈 발생 가능
- 정규표현식 기능 없음: 파싱 이후 별도 처리 필요
5. 주요 사용 사례
사례 | 설명 |
---|---|
뉴스/블로그 크롤러 | 웹 페이지에서 기사, 본문, 날짜 추출 |
메타데이터 수집 | <meta> , <title> 태그에서 정보 수집 |
스크래핑 앱 | 가격 비교, 쿠폰 정보 수집 등 |
정적 HTML 검사 | 템플릿 검증 자동화 테스트 |
6. Kanna vs 경쟁 라이브러리
라이브러리 | 언어 | XPath | CSS Selector | 주요 특징 |
---|---|---|---|---|
Kanna | Swift | ✅ | ✅ | iOS/macOS에서 가장 많이 사용됨 |
Fuzi | Swift | ✅ | ❌ | 경량, XPath만 지원 |
SwiftSoup | Swift | ❌ | ✅ | CSS Selector 기반, JSoup 포팅 |
Hpple | Obj-C | ✅ | ✅ | Kanna 이전 대표 라이브러리 |
7. 버전 히스토리 및 유지관리
- 최초 릴리즈: 2015년
- 활성화 여부: GitHub에서 활발한 유지보수 진행 (2025년 기준 최신 커밋 있음)
- 저자: tid-kijyun
- 레포지토리: https://github.com/tid-kijyun/Kanna
8. 보안 및 안정성 고려사항
- 외부 HTML 파싱 시 XSS/스크립트 인젝션 가능성 고려 필요
- 비정형 HTML 파싱 시 오류 처리 로직 필수
- UTF-8 등 문자 인코딩 오류 대응 필요
9. 결론 및 권장사항
Kanna는 iOS/macOS 환경에서 HTML/XML 파싱이 필요한 앱 또는 크롤링 도구 개발에 매우 적합함. XPath와 CSS Selector를 모두 지원하며, 직관적인 API와 성능 면에서도 높은 수준을 보여줌. 다만 대규모 파싱과 비동기 작업이 필요할 경우 메모리 관리와 네트워크 처리 분리 구조에 대한 추가 설계가 필요함.
✅ 추천 대상:
- Swift 기반 앱 개발자
- iOS 웹 데이터 크롤링 기능이 필요한 프로젝트
- 경량 HTML/XML 파서가 필요한 경우
⚠️ 비추천 대상:
- 서버사이드 크롤러 개발 (Python의 BeautifulSoup 등 추천)
- 매우 큰 문서를 실시간으로 처리해야 하는 경우
답글 남기기