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 아님) |
@ | 태그 속성 매칭 |
예제 상세 분석
/WebInfos
루트 노드에서 최상위<WebInfos>노드를 가져옴/WebInfos/WebInfo[1]
첫 번째<WebInfo>노드 획득 → FoxDevelop 데이터
⚠️ XPath 인덱스는 1부터 시작합니다
/WebInfos/WebInfo[Age>5]
자식 노드<Age>값이 5보다 큰 WebInfo 노드 필터링
매치 결과:google(23), microsoft(13)/WebInfos/WebInfo[Age>5]/Name
위 필터 결과에서 자식<Name>노드 추출/WebInfos/WebInfo[last()]last()함수:마지막 WebInfo 노드 → microsoft/WebInfos/WebInfo[last()-1]
마지막에서 두 번째 WebInfo 노드 → google/WebInfos/WebInfo[position()<3]position()로 노드 순번 획득;순번이 3 미만인 노드 선택 → 앞의 두 건(FoxDevelop, google)//IP[@type='ipv4']//전역 검색;type속성이ipv4인<IP>노드 필터//@type
문서 내 모든type속성 가져오기//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