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>요소를 모두 선택함.
'Programming' 카테고리의 다른 글
Python from datetime import datetime / Datetime 모듈 사용하는 방법 (0) | 2021.12.07 |
---|---|
python os 모듈 사용하는 방법 (0) | 2021.12.07 |
[Linux] nano 에디터 사용하는 방법 (0) | 2021.12.06 |
Django web develpment Whitenoise 사용하는 방법 (0) | 2021.11.28 |
리눅스 파일 시스템 권한 확인하기 (0) | 2021.11.27 |
[Linux Ubuntu] 우분투 visual code 설치하는 방법 (0) | 2021.11.26 |
댓글