문서 객체 가져오기
1. 문서 객체 생성
HtmlDocument document = new HtmlDocument();Code language: JavaScript (javascript)
2. 두 가지 불러오는 방식
1)HTML 문자열 불러오기
document.LoadHtml(htmlString);Code language: JavaScript (javascript)
2)로컬 HTML 파일 불러오기(깨진 문자 방지를 위해 인코딩 지정)
document.Load(@"c:/news.html", Encoding.UTF8);Code language: JavaScript (javascript)
Windows 경로는
@기호로 이스케이프를 끄는 걸 권장합니다. 교재의c://news.html은 예시 표기일 뿐입니다.
3. 루트 노드 가져오기
HtmlNode rootNode = document.DocumentNode;Code language: JavaScript (javascript)
모든 xpath 쿼리는 rootNode 기준으로 실행됩니다.
노드 조작
1. 노드 HTML로 새 노드 만들기
HtmlNode newNode = HtmlNode.CreateNode(newsNode.OuterHtml);
OuterHtml:자신 태그와 내부 모든 HTML 내용을 포함- 노드 복사나 일부 HTML을 잘라 따로 분석할 때 자주 사용
2. 노드 조회
SelectSingleNode("XPath"):조건에 맞는 첫 번째 노드를 반환, 반환타입HtmlNode
HtmlNode childNode = itemNode.SelectSingleNode("//div[1]");Code language: JavaScript (javascript)
SelectNodes("XPath"):조건에 맞는 모든 노드를 가져오며 반환타입은HtmlNodeCollection
3. 텍스트와 속성 읽기
- 노드 안 순수 텍스트 가져오기
string text = itemNode.InnerText;
- 태그 속성 읽기(기본 문법)
string href = itemNode.Attributes["href"].Value;Code language: JavaScript (javascript)
주의:태그에
href속성이 없으면Attributes["href"]가 null이 되어 코드 오류가 발생합니다.
안전한 작성 방식 권장:
string href = itemNode.GetAttributeValue("href", "");Code language: JavaScript (javascript)
4. 뉴스 목록 순회 완성 예제 코드
foreach (HtmlNode item in newsList)
{
string title = item.InnerText;
string href = item.Attributes["href"].Value;
}Code language: PHP (php)
추가 설명
- null 처리
SelectNodes()는 일치하는 노드가 없으면null을 반환합니다. foreach 반복 전 반드시 검사해야 합니다:
if(newsList != null)
{
foreach(var item in newsList){ ... }
}Code language: PHP (php)
- InnerText / InnerHtml / OuterHtml 구분
InnerText:태그를 전부 제거하고 텍스트만 추출InnerHtml:노드 내부 HTML, 자신 태그는 제외OuterHtml:자신 태그 + 내부 전체 HTML
- XPath 팁
//div는 전체 범위에서 div를 검색하고,//를 빼면 직계 자식 노드만 매칭합니다.
전체 예제
using HtmlAgilityPack;
using System.Text;
//1.문서 초기화
HtmlDocument document = new HtmlDocument();
document.Load("news.htm", Encoding.UTF8);
HtmlNode rootNode = document.DocumentNode;
//2.뉴스 링크 일괄 조회
HtmlNodeCollection newsList = rootNode.SelectNodes(@"//div[@class='blk122']/a");
if(newsList != null)
{
foreach (HtmlNode item in newsList)
{
string title = item.InnerText.Trim();
string link = item.GetAttributeValue("href", "");
Console.WriteLine($"제목:{title} 링크:{link}");
}
}Code language: JavaScript (javascript)
문서 콘텐츠 가져오기
Previous: 활용 예시