문서 콘텐츠 가져오기

문서 객체 가져오기

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. 텍스트와 속성 읽기

  1. 노드 안 순수 텍스트 가져오기
string text = itemNode.InnerText;
  1. 태그 속성 읽기(기본 문법)
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)

추가 설명

  1. null 처리
    SelectNodes()는 일치하는 노드가 없으면 null을 반환합니다. foreach 반복 전 반드시 검사해야 합니다:
if(newsList != null)
{
    foreach(var item in newsList){ ... }
}Code language: PHP (php)
  1. InnerText / InnerHtml / OuterHtml 구분
  • InnerText:태그를 전부 제거하고 텍스트만 추출
  • InnerHtml:노드 내부 HTML, 자신 태그는 제외
  • OuterHtml:자신 태그 + 내부 전체 HTML
  1. 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:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다