우리가 크롤링할때 class 값이나 id값이 계속 변하거나 아예 없을 경우 원하는 값을 가져오기가 쉽지 않은 경우가 있다.
이런 경우는 xpath가 여러분의 유용한 도구가 되어 줄 것이다.
아래 예시를 참고하여 학습해보자.
1. 텍스트기준으로 찾기
우리가 크롤링 하고 싶은 부분은 노란색 블록 부분이다.
기본적으로 class값 이용하여 크롤링을 하지만 보다시피 알수 없는 문자로 이루어져있는 class값이다. 이런 class값은 시간이 변함에 따라 자주 변하기때문에 변할때마다 코드를 변경해야하는 수고로움이 발생한다.
이럴때는 변하지 않을 것같은 의미 있는 부분을 기준으로 크롤링하는것이 좋다.
필자가 여기서 변하지 않을 것으로 판단한 부분은 Choose your size라는 텍스트이다.
xpath를 이용하여 이 텍스트를 어떻게 찾는지 한번 알아보자.
미리 정답 부터 말하자면 해당 코드를 찾는 XPATH 코드는
"//div[text() = 'Choose your size']" 이다.
1. // 은 전체 HTML을 기준으로 찾겠다는 의미이다.
2. 찾고자 하는 부분의 태그명이다.
3. xpath에서는 추가적인 속성값을 찾을때 대괄호를 열고 닫음로써 시작한다.
4. text값을 찾을때 사용하는 방식이다. text() = '태그에 있는 텍스트문자'
+보너스
1-2) 특정문자를 포함하는 부분 찾기
크롤링을 하다보면 특정문자를 포함하는 부분을 찾고싶을때가있다.
이번에도 노란색 블록 부분이 우리가 찾을 위치이나 1번 예제랑 다른점이 있다면 "Choose your size" 전체가 아닌 이 안에 포함된 문자중 하나를 기준으로 쓰는것이다.
필자는 "Choose"를 골랐다. 즉, "Choose"라는 텍스트를 포함하는 태그 위치를 찾겠다라는 것이다.
해당 위치의 xpath는
"//div[contains(text(),'Choose')]"
1. // 은 전체 HTML을 기준으로 찾겠다는 의미이다.
2. 찾고자 하는 부분의 태그명이다.
3. 대괄호 다음 contains와 함께 괄호를 추가한다.
4. text값을 찾을때 사용하는 방식으로 위 예제와는 다르게 . ' = ' 가 아닌 ' , '로 구분하여 적어준다.
2. 부모 태그 찾기
우리가 원하는 태그를 찾았다. 여기서 더 나아가 xpath 를 이용한 아래 부모 태그를 찾아보자
xpath 에서 부모태그 찾는 법은 간단하다. 그냥 '/..' 을 붙혀주면된다.
"//div[text() = 'Choose your size']/.." or "//div[contains(text(),'Choose')]"
끝이다..
3. text이외에 속성값을 기준으로 찾기
크롤링을 하다보면 class값이나 id도아닌 생전 처음보는 속성값들을 마주하게되는 이러한 값들을 찾는 방법이다.
해당 코드에서 우리는 class 값이 아닌 aria-label이라는 속성값을 이용하여 해당 태그를 찾아보겠다.
이번에도 정답부터 말하면.
//span[@aria-label=’좋아요’]
1. // 은 전체 HTML을 기준으로 찾겠다는 의미이다.
2. 찾고자 하는 부분의 태그명이다.
3. xpath에서는 추가적인 속성값을 찾을때 대괄호를 열고 닫음로써 시작한다.
4. 해당 속성값 앞에 @를 붙히고 작성해준다.
+보너스
속성값도 contains 를 포함하여 아래와 같이 코드를 작성할 수 있다.
"//span[contains(@aria-label,’좋아요’]"
자세한 설명은 위의 text기준으로 찾기 예제를 참고하길 바란다.
이 글과 읽으면 좋은글
'파이썬 > 파이썬 기초' 카테고리의 다른 글
[파이썬 기초] 셀레니움(selenium) NoSuchElementException , ElementNotVisibleException 에러 해결 방법 (0) | 2020.05.13 |
---|---|
[파이썬 기초] 엑셀에 이미지 삽입하기 (0) | 2020.04.02 |
[python 기초] PIL 을 활용하여 webp 이미지 확장자 변경하기 (0) | 2020.03.26 |
[python 기초] 이미지 다운 받기(requests, urllib.request) (2) | 2020.03.25 |
[파이썬 기초] PIL을 이용하여 이미지 크기를 변경하자. (0) | 2020.03.10 |
댓글