본문 바로가기
VBA/엑사남_심화방

[심화방] 복잡한 태그속에서 원하는 값 가져오기

by 일등미노왕국 2023. 8. 20.

먼저 앞서서 이번 포스팅은 셀레니움이 아니다.

 

같은 크루중 한분이 질문한 내용이다.

 

 

 크롤링 관련 질문인데...
본인이 처음 크롤링을 배울때 정확히 말하면 innerText만 알았을 때 속성값을 가져오는 것에 대해서 너무 애를 먹었던 적이 있다. 이분 역시 속성값을 가져오는것에 대해서 질문이 시작 되었다.

 

이 속성값을 가져오는 방법은 언어마다 약간식 다르지만 VBA에서는 getAttribute이다. 

위 사진을 보면 현재 아이디 값이 page--game-detail 이고 가져와야 하는 값은 오른쪽 상단에 있는 date-game-price이다. 그렇다면 저 아이디를 선택자로 잡은 다음 date-game-price 의 값만 가져오면 된다.

Html.body.innerHTML = Http.responseText
            
strText = Html.getElementById("page--game-detail").getAttribute("data-game-price")

rngA(1, 6) = strText

하지만 이글을 보는 분들은 장기적으로 봤을 때는 QuerySeletor 문법을 이용하기 바란다. 이는 다시 이렇게 바꿀 수 있다.

Html.body.innerHTML = Http.responseText
            
strText = Html.QuerySelector("#page--game-detail").getAttribute("data-game-price")

rngA(1, 6) = strText

id 값이기 때문에 #이 사용된걸 확인바란다.

 

이렇게 했다면 정가인 39.99 를 가져오게 되었을 것이다.

 

물론 속성값에 data-game-id를 적었다면 4204719를 가져왔을 것이다.

 

자 다시 이 그림을 보도록 하자

질문하신 분은 PS+: 다음의 strong 태그를 감싸인 값을 가져오긴 원한다.
저기에 당일의 최저가로 변화는 듯 하다.

 

허나 만약 $0이라고 하면 [최저 가격 : ]인 $13.99값을 가져오길 바란다.

 

태그를 보면 알겠지만 간단하게 바로 위 태그를 가져와서 하기에는 태그 중복이 너무 많아서 힘이 들게 될것이다.

현재 가져오려는 값은

 

앞서 추출한 id값의 세번째 div태그 자식임을 알수 있기 때문에, 이렇게 querySelector를 사용할 수 있다.

 

pricetext = Html.querySelector("#page--game-detail:nth-child(3)").innerText

 

이렇게 하면 3번째 div 태그안에 있는 모든 innerText가 들어오게 될것이다.

 

너무 당황하지말고 잘 보게 되면 우리가 가져오고 싶은 값은  여러 텍스트 중에 

PS+: 이후의 값이다. 

 

자 그럼 우리가 텍스트를 모두 가져온 값을 변수 pricetext에 담았으니까.

그 값에서 PS+: 기준으로 한번 자르고, 다시 띄어쓰기로 나누면 우리가 원하는 값을 가져오게 된다.

 

처음 split를 하면 : 배열의 (1)번째

필요없는 내용 / 필요 있는내용

 

두번째 split를 하면 : 배열의 (0)번째

필요있는 내용 / 필요 없는 내용

 

이렇게 구문이 진행되면 우리가 원하는 값을 가져오게 된다.

 

pricetext = Html.querySelector("#page--game-detail:nth-child(3)").innerText
             
pricetext = Split(Split(pricetext, "PS+: ")(1), " ")(0)

rngA(1, 7) = pricetext

 

여기서 하나 더 나아가면 질문하신 분은 최저가가 $0이 아닐때는 [PS+: ]이후의 값을 원했지만 $0일 때는 [최저 가격: ] 이후 값을 원했기 때문에 조건문만 한번 더 쳐주면 된다.

pricetext = Html.querySelector("#page--game-detail:nth-child(3)").innerText
             
 pricetext = Split(Split(pricetext, "PS+: ")(1), " ")(0)

 If pricetext <> "$0" Then
    rngA(1, 7) = pricetext
 Else
    pricetext = Split(Split(pricetext, "최저 가격: ")(1), " ")(0)
    rngA(1, 7) = pricetext
 End If

 

정리하면 오늘 포스팅은 
1. 속성값을 가져오는 방법

2. 자식태그를 선택하는 방법

 

3. 마지막으로 이중 split으로 원하는 값을 가져오는 방법 

 

이 3가지에 대해서 알아보았다. 마지막으로 console 창에 이를 실행하는 코드를 끝으로 포스팅을 마무리 하려고 한다.

 

댓글