본문 바로가기
Programming

Xpath 10분만에 이해하기

by 하하호호 2021. 12. 1.
반응형

 

xpath는 XML 형식의 데이터를 읽어들이는

쿼리 언어의 한 종류다. XML로 정리된 대표적인

데이터가 우리가 흔히 사용하는 웹 상의

웹페이지를 구성하는 HTML이다.

 

Xpath를 사용하는 가장 큰 목적은 XML로 

구성된 데이터를 손쉽게 크롤링 하기 위함

이다. 즉, 내가 뽑아내고 싶은 데이터를 정확하게

디렉팅 할 수 있어야 한다.

 

#1 구성

Xpath는 크게 absolute Xpath와 relative Xpath로

나뉜다. 

 

Absolute Xpath는 XML 데이터의 전체 path를 

의미한다. "/" 슬래쉬 하나로 시작하며, 길이가

굉장히 길어질 수 있기 때문에 실제 개발 환경에

사용하기에는 부적합하다.

 

Relative Xpath는 특정 element를 손쉽게

가져올 수 있다. "//" 슬래쉬 두개로 시작하게

되고, 속성값을 가지고 특정 element를 

특정한다.

 

또한 xpath에서 속성값을 지정하기 위해서는

"@" 기호를 사용한다.

 

xpath에서 모든 element를 지정하는 기호는 "*"다.

 

현재 노드를 선택하는 기호는 "." 이다.

 

만약 아래의 input tag를 가져오고 싶다면,

<input name="q"/>

 

xpath는 다음과 같다.

 xpath('//input[@name="q"]')

 

#2 경로 연산자

예제

developer            : <developer>요소를 모두 선택함.

/p_languages         : 루트 노드의 자식 노드인 <p_languages>요소를 선택함. (절대 경로 탐색)

p_languages/language : <p_languages>요소의 자식 노드 중 <language>요소를 모두 선택함. (상대 경로 탐색)

//                   : 루트 노드의 하위 노드를 모두 선택함.

//priority           : 위치에 상관없이 <priority>요소를 모두 선택함.

.//                  : 현재 노드의 하위 노드를 모두 선택함.

version/@status      : 모든 <version>요소의 status 속성 노드를 모두 선택함.

 

#3 XML 모델

XML에서 어떤 방향으로 노드를 찾아나갈지 

경로를 지정해줘야 한다. 위로는 parent, 

옆으로는 preceding / following이 있고,

아래로는 child가 있다.

 

검색 방향설명

self 현재 노드를 선택함.
attribute 현재 노드의 속성 노드를 모두 선택함.
namespace 현재 노드의 네임스페이스 노드를 모두 선택함.
child 현재 노드의 자식 노드를 모두 선택함.
descendant 현재 노드의 자손 노드를 모두 선택함.
descendant-or-self 현재 노드와 현재 노드의 자손 노드를 모두 선택함.
following XML 문서에서 현재 노드의 종료 태그 이후에 등장하는 모든 노드를 선택함.
following-sibling 현재 노드 이후에 위치하는 형제 노드를 모두 선택함.
parent 현재 노드의 부모 노드를 선택함.
ancestor 현재 노드의 조상 노드를 모두 선택함.
ancestor-or-self 현재 노드와 현재 노드의 조상 노드를 모두 선택함.
preceding XML 문서에서 현재 노드 이전에 등장하는 모든 노드를 선택함.
(조상 노드, 속성 노드, 네임스페이스 노드는 제외함)
preceding-sibling 현재 노드 이전에 위치하는 형제 노드를 모두 선택함.

 

경로 표현식은 

검색방향::노드테스트[필터표현식]으로 사용한다.

 

검색방향은 현재 노드 기준으로 검색할 노드 방향을 결정한다.

노드테스트는 검색 방향에 존재하는 노드를 검색한다.

필터 표현식은 검색된 노드셋에서 특정노드 혹은 특정 값을

포함하는 노드를 선택한다.

 

예제

child::language            : 현재 노드의 자식 노드 중 <language>요소를 모두 선택함.

attribute::version         : 현재 노드의 version 속성 노드를 선택함.

descendant::*              : 현재 노드의 자손 노드를 모두 선택함.

descendant::text()         : 현재 노드의 자손 노드 중 텍스트 노드를 모두 선택함.

ancestor::language         : 현재 노드의 조상 노드 중 <language>요소를 모두 선택함.

ancestor-or-self::language : 현재 노드와 현재 노드의 조상 노드 중 <language>요소를 모두 선택함.

child::*/child::category   : 현재 노드의 자식 노드의 자식 노드 중 <category>요소를 모두 선택함.

 

 

 

반응형

댓글