셀레니움 xpath 관련

VBA
작성자
두부
작성일
2021-01-01 13:24
조회
76
안녕하세요, 2020년 연말 마무리 잘 하셨나요?

2021 새해가 밝았습니다. 새해는 오빠두와 함께 엑셀 스킬을 더 향상시키고자 합니다.

vba 크롤링 관련 질문입니다.

셀레니움을 활용해서 xpath를 긁어오는 과정에서 문법오류인지 결과값이 가져와지지 않아 문의드립니다.
Dim driver As New WebDriver
Dim url
Dim 행들 As WebElements
Dim 값들 As WebElement

앞부분 생략

.

.

'가져오려는 데이터 형식은 특정 테이블 내에있는  행들을 순환하여 각각 개별컬럼들의 값을 가져오려합니다.

예시) TABLE
Request no Booking no Split Via Request date Booking Date
123456 5815 N 가나다 10/3 12/3
123457 5795 N 라마다 10/8 12/5
아래 내용처럼 행들은 tr[2], tr[3], tr[4]으로 각각의 행들의 full xpath 값들입니다.

'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]

'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[3]

'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[4]

 

' tr[]에 위치값을 표기하지 않고 행들을 xpath로 한번에 "행들"에 담아둡니다.

Set 행들 = driver.FindElementsByXPath("/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr")

cnt = 1

For Each 값들 In 행들
Request no Booking no Split Via Request date Booking Date
123456 5815 N 가나다 10/3 12/3
123457 5795 N 라마다 10/8 12/5
'각각 데이터에 해당하는 full xpath 값은 아래와 같습니다.

'Request no
'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]/td[8]/a -> 2번째 행

'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[3]/td[8]/a -> 3번째 행

'위의 행들이 2번째 행에서 3번째 행으로 넘어가면서 tr순번만 바뀌고 나머지 위치값은 고정되는걸 확인했습니다.

 

'Booking no
'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]/td[9]

'Split
'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]/td[10]

'Request date
'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]/td[18]

'booking date
'/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]/td[19]

 

'각각의 xpath로 접근해서 해당값들을 셀에 담습니다.

' 그러나 dubug 창으로 한단게 값으로 이동되면서 오류 메세지는 뜨지 않는데, 해당셀에 아무런 값도 입려되지 않습니다...

' Set 행들 = driver.FindElementsByXPath("/html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr")값 중

뒤의 tr[2]로 지정했을 때는 셀에 정상적으로 출력이 됩니다.(즉, tr[2]/[td[8])의 접근은 되나, tr/td[8]이런 식의 접근은 안됩니다.)

' tr로 다수의 행들' 변수에  데이터가 다 들어오는 것도 확인했었습니다.


  Range("a" & cnt) = 값들.FindElementByXPath("td[8]").Text

  Range("b" & cnt) = 값들.FindElementByXPath("td[9]").Text
  Range("c" & cnt) = 값들.FindElementByXPath("td[10]").Text
  Range("d" & cnt) = 값들.FindElementByXPath("td[18]").Text

Range("e" & cnt) = 값들.FindElementByXPath("td[19]").Text

cnt = cnt + 1

 

Next

 

질문요약

  1. 해당 프로세스가 vba자체 제한적인 부분인지, 제가 문법상의 오류가 있는 것인지 모르겠습니다.

    2. 그외에 다양한 xpath 문법중에 vba가 지원이 안되는 부분이 많은가요?(xpath의 경로가 바뀌는 문제가 생길시, 정확한 크롤링이 어려운 부분있는것 같습니다.)

xpath문법 예시
//tagname[@attribute='value']
//*[contains(@id,'message')]
//*[@type='submit' or @name='btnReset']
//input[@type='submit' and @name='btnLogin']
//td[text()='UserID']
 

오빠두님께서는 이런 부분에 대한 헤안을 가지고 계실것 같습니다.

2021년  커뮤니티가 더 활성화 되어, 엑셀계의 stakover flow이상의 커뮤니티로  활성화 되었스면 좋겠습니다!

급하게 조잡하게 질문드렸는데, 제대로 전달이 되었을지 모르겠습니다.

 

감사합니다.
전체 3

  • 2021-01-01 18:54

    안녕하세요.

    XPath는 크롤링 하기에 매우 편리한 툴이지만, 개인적으로 사용하는 것을 권장드리진 않습니다.

    그 이유는,

    /html/body/div[3]/div[2]/div/form/div[3]/div/div[3]/div[3]/div/table/tbody/tr[2]/td[10]

    위와 같이 각각의 개체에 접근해서 값을 가져오게 되는데, 이럴 경우 페이지 소스가 조금이라도 바뀌면 전체 명령문을 다시 수정해줘야되고, 따라서 유지보수에 번거로운 상황이 자주 발생합니다.

    추가로 디버깅하기에도 많이 어려운 문제가 있습니다.

    그래서 가능하다면, HTML 과 CSS 구조 공부에 조금만 시간을 투자하셔서, HTML 개체를 받아온 뒤 HTML 문서에서 테이블을 읽어와 크롤링 하시는 것을 추천드립니다. 테이블 크롤링 관련 예제는 아래 링크를 확인해보세요.

    https://stackoverflow.com/questions/44653360/vba-scraping-information-from-html-table

    XPath는 크롬에서 제공되는 추가기능을 활용하는 방법으로 모든 프로그래밍 언어에서 동일한 방식으로 사용됩니다. 따라서 VBA에서의 제한사항은 없습니다.

    오류가 반환되지 않는 이유도 크롬에서 값을 받아오는 것이기 때문에, 코드 자체에서 발생하는 오류가 아닌 이상 빈칸을 반환하고 넘어가게 됩니다.

    코드에는 문제가 없을 것으로 생각되고, 아마 Xpath 개체 경로가 잘못되어서 빈칸이 반환되는 것이 아닐까 예상됩니다.

    직접적인 도움을 드리지 못해서 죄송합니다. 조금이나마 답변이 도움이 되셨길 바랍니다.


    • 2021-01-02 13:39

      답변 감사드립니다. 알려주신 링크는 internet explorer 환경으로 보이는데, html, css를 가져오는 htmldocument와 같은 html library는 셀레니움 환경인 webdriver에서 가져 올 수 있는 방법이 있는 걸까요?


      • 2021-01-03 14:47

        안녕하세요.

        webdriver 에서 HTML 문서를 가져올 수 있습니다.

        아래와 같이 명령문을 사용해보세요.

        Dim HTML As New HTMLDocument
        HTML.body.innerHTML = webdriver.ExecuteScript("return document.body.innerHTML;")

        답변이 도움이 되셨길 바랍니다.


전체 2,058
번호 카테고리 제목 작성자 작성일 추천 조회
2050 VBA
New 리스트 박스 표시 형식 변경
새우튀김 | 01:08 | 추천 0 | 조회 13
새우튀김 01:08 0 13
2049 VBA
New IMPORTHHTML 함수 추가기능 vba구현
이예본 | 2021.01.15 | 추천 0 | 조회 10
이예본 2021.01.15 0 10
2048 기능/도구
New 혹시 이모지 질문입니다.
조민성 | 2021.01.15 | 추천 0 | 조회 18
조민성 2021.01.15 0 18
2047 기능/도구
New 메일머지에 사진 나오게 하는법
욕심없는성공v | 2021.01.15 | 추천 0 | 조회 28
욕심없는성공v 2021.01.15 0 28
2046 함수/공식
New 초보입니다ㅠ 호봉을 자동으로 구하고 싶어요~ (2)
eggs**** | 2021.01.15 | 추천 0 | 조회 38
eggs**** 2021.01.15 0 38
2045 함수/공식
New 년도별 금액평균을 구하고 싶어요 첨부파일 (1)
DDD | 2021.01.15 | 추천 0 | 조회 38
DDD 2021.01.15 0 38
2044 함수/공식
New 수량별 개수 곱합 후 합계금액 구하기 첨부파일 (1)
민준맘 | 2021.01.15 | 추천 0 | 조회 31
민준맘 2021.01.15 0 31
2043 VBA
New 시트 합치기는 나오는데 여러개 엑셀파일 통합은 어떻게 하나요? 첨부파일 (1)
wbyu**** | 2021.01.15 | 추천 0 | 조회 32
wbyu**** 2021.01.15 0 32
2042 피벗테이블
New 피벗 원데이터에 공백이 있을경우 (3)
H.B | 2021.01.15 | 추천 1 | 조회 37
H.B 2021.01.15 1 37
2041 기능/도구
New 인터넷 연결 및 API 오류 해결 도와주세요. 하라신 3가지 다했는데 안되네요 (1)
susu | 2021.01.15 | 추천 0 | 조회 23
susu 2021.01.15 0 23
2040 VBA
New VBA Form 실행 위치 관련 (2) 답변완료
새우튀김 | 2021.01.15 | 추천 0 | 조회 24
새우튀김 2021.01.15 0 24
2039 기능/도구
New 엑셀 셀병합시 궁금한점 질문드려요 (4)
huni0211 | 2021.01.15 | 추천 1 | 조회 42
huni0211 2021.01.15 1 42
2038 함수/공식
New 시트일별합산금액 원하는 셀에 날짜별로 표시하기 첨부파일 (5) 답변완료
민준맘 | 2021.01.14 | 추천 0 | 조회 51
민준맘 2021.01.14 0 51
2037 함수/공식
New 합계중 가장 큰 값을 구해 일련번호를 구하는 방법을 알고 싶습니다. 첨부파일 (5) 답변완료
수에이드 | 2021.01.14 | 추천 0 | 조회 30
수에이드 2021.01.14 0 30
2036 함수/공식
New 근속차월수를 기준으로 입사년월을 역계산하는 방법 첨부파일 (1)
블링블링 | 2021.01.14 | 추천 0 | 조회 22
블링블링 2021.01.14 0 22
2035 VBA
New 웹크롤링 Class 질문입니다. (3)
후훗카카 | 2021.01.14 | 추천 0 | 조회 32
후훗카카 2021.01.14 0 32
2034 함수/공식
New 순이익 파악을 할때에 어떻게 해야 할까요? (1)
박준규 | 2021.01.14 | 추천 0 | 조회 26
박준규 2021.01.14 0 26
2033 기능/도구
New 아이콘 추가 관련해서 질문합니다 첨부파일 (1) 답변완료
조민성 | 2021.01.14 | 추천 0 | 조회 22
조민성 2021.01.14 0 22
2032 함수/공식
New 조건에 맞는 항목 찾아서 정렬해주는 방법 (1)
켄타로 | 2021.01.14 | 추천 0 | 조회 36
켄타로 2021.01.14 0 36
2031 함수/공식
New 구매처 제품별 최초 구매일과 최근 구매일을 확인하는 함수를 알고 싶어요. 첨부파일 (2) 답변완료
아라 | 2021.01.14 | 추천 0 | 조회 40
아라 2021.01.14 0 40
2030 함수/공식
New 고급필터 상위 수량 최대 10개만 추출할 수 있나요? (1)
naver_5f697d4255690 | 2021.01.14 | 추천 0 | 조회 23
naver_5f697d4255690 2021.01.14 0 23
2029 VBA
New 안녕하세요. 스마트스토어 관련 자료도 크롤링 가능한가요? (1)
부자가될꾸얏 | 2021.01.14 | 추천 0 | 조회 25
부자가될꾸얏 2021.01.14 0 25
2028 기능/도구
New SendKakao 기능을 이용해서 이미지를 동시에 송출하려고 하는데... (2) 답변완료
EXCELCHOBO | 2021.01.14 | 추천 0 | 조회 33
EXCELCHOBO 2021.01.14 0 33
2027 피벗테이블
New 피벗관련 간단 질문사항 첨부파일 (2) 답변완료
H.B | 2021.01.14 | 추천 1 | 조회 31
H.B 2021.01.14 1 31
2026 함수/공식
New 문서 고유번호 매기기 (3)
왜사는건지 | 2021.01.14 | 추천 0 | 조회 36
왜사는건지 2021.01.14 0 36
2025 문서서식
New 조건부서식 동적범위 첨부파일 (2)
두부 | 2021.01.14 | 추천 0 | 조회 34
두부 2021.01.14 0 34
2024 차트/그래프
New 엑셀 실시간 주식 차트 만들기 | 엑셀차트10강 (5)
yk**** | 2021.01.14 | 추천 0 | 조회 44
yk**** 2021.01.14 0 44
2023 함수/공식
New 엑셀 수식 입력 단축키 (2)
체리빵 | 2021.01.13 | 추천 0 | 조회 51
체리빵 2021.01.13 0 51
2022 기능/도구
New 시트에 있는 도형 삭제않되게 할수 있나요? (4) 답변완료
이하늘 | 2021.01.13 | 추천 0 | 조회 26
이하늘 2021.01.13 0 26
2021 VBA
New 옵션단추에 따른 저장여부지정 첨부파일 (2) 답변완료
iviolin**** | 2021.01.13 | 추천 0 | 조회 31
iviolin**** 2021.01.13 0 31