XPath

1. XPath이란 무엇인가

XPath(XML Path Language)는 XML 경로 언어입니다. 주요 역할:
경로 표현식을 사용해 XML/HTML 문서의 노드, 노드 텍스트, 노드 속성을 조회하고 조건 기반 필터링도 지원합니다.

핵심 포인트: HtmlAgilityPack은 HTML 문서를 XML DOM처럼 다루기 때문에 XPath로 웹 콘텐츠를 크롤링할 수 있습니다.

2. 참고용 XML 예시

<?xml version="1.0" encoding="utf-8"?>
<WebInfos>
    <WebInfo>
        <Name>FoxDevelop</Name>
        <Domain>https://foxdevelop.com</Domain>
        <IP type="ipv4">127.0.0.1</IP>
        <Age>1</Age>
    </WebInfo>
    <WebInfo>
        <Name>google</Name>
        <Domain>https://www.google.com</Domain>
        <IP type="ipv4">95.0.0.1</IP>
        <Age>23</Age>
    </WebInfo>
    <WebInfo>
        <Name>microsoft</Name>
        <Domain>https://www.microsoft.com</Domain>
        <IP type="ipv4">192.186.0.1</IP>
        <Age>13</Age>
    </WebInfo>
</WebInfos>Code language: HTML, XML (xml)

3. XPath 문법 상세 설명

기호 설명
기호의미
/루트 노드부터 탐색 시작;계층 구분자
//문서 전체 영역에서 탐색, 계층 제한 없음
[]조건 필터, 인덱스. 인덱스는 1부터 시작(0 아님)
@태그 속성 매칭
예제 상세 분석
  1. /WebInfos
    루트 노드에서 최상위 <WebInfos> 노드를 가져옴
  2. /WebInfos/WebInfo[1]
    첫 번째 <WebInfo> 노드 획득 → FoxDevelop 데이터

⚠️ XPath 인덱스는 1부터 시작합니다

  1. /WebInfos/WebInfo[Age>5]
    자식 노드 <Age> 값이 5보다 큰 WebInfo 노드 필터링
    매치 결과:google(23), microsoft(13)
  2. /WebInfos/WebInfo[Age>5]/Name
    위 필터 결과에서 자식 <Name> 노드 추출
  3. /WebInfos/WebInfo[last()]
    last() 함수:마지막 WebInfo 노드 → microsoft
  4. /WebInfos/WebInfo[last()-1]
    마지막에서 두 번째 WebInfo 노드 → google
  5. /WebInfos/WebInfo[position()<3]
    position()로 노드 순번 획득;순번이 3 미만인 노드 선택 → 앞의 두 건(FoxDevelop, google)
  6. //IP[@type='ipv4']
    // 전역 검색;type 속성이 ipv4<IP> 노드 필터
  7. //@type
    문서 내 모든 type 속성 가져오기
  8. //WebInfo
    중첩 계층 상관없이 문서 안의 모든 <WebInfo> 노드 검색

4. 실용 확장 표현

//Name/text()              # Name 태그 내부 텍스트 추출
//WebInfo[Name="FoxDevelop"]     # 텍스트 내용으로 노드 매칭
//IP/@type                 # IP 태그의 type 속성 값 읽기Code language: JSON / JSON with Comments (json)

5. HtmlAgilityPack에서 사용하기

var doc = new HtmlDocument();
doc.Load("demo.xml");

// Age>5 인 사이트 이름 모두 선택
var nodes = doc.DocumentNode.SelectNodes(@"/WebInfos/WebInfo[Age>5]/Name");
foreach(var node in nodes)
{
    Console.WriteLine(node.InnerText);
}Code language: PHP (php)

XPath

Previous:

답글 남기기

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