HTML 라이브러리 사용하기 귀찮을 때, 사용하는 파싱함수 (getElementsByTag, getAttribute)

작성자
오빠두엑셀
작성일
2021-11-09 21:58
조회
76
Function getElementsByTag(sHTML, Tag As String) As Variant
 
Dim vArr As Variant
Dim vResult As Variant
Dim v As Variant
Dim i As Long
 
vArr = Split(sHTML, "<" & Tag)
 
ReDim vResult(LBound(vArr) To UBound(vArr) - 1)
 
For i = LBound(vArr) + 1 To UBound(vArr)
vResult(i - 1) = "<" & Tag & Split(vArr(i), "</" & Tag & ">")(0) & "</" & Tag & ">"
Next
 
getElementsByTag = vResult
 
End Function
 
Function getAttribute(sHTML, Atts As String) As Variant
 
Dim i As Long
Dim val As String
Dim e1 As Long: Dim e2 As Long: Dim e As Long
i = InStr(1, sHTML, Atts)
e1 = InStr(i, sHTML, " "): If e1 = 0 Then e1 = Len(sHTML)
e2 = InStr(i, sHTML, ">"): If e2 = 0 Then e2 = Len(sHTML)
If e1 > e2 Then e = e2 Else e = e1
 
On Error Resume Next
val = Mid(sHTML, i + Len(Atts) + 1, e - i - Len(Atts) - 1)
If Left(val, 1) = """" Then val = Right(val, Len(val) - 1)
If Right(val, 1) = """" Then val = Left(val, Len(val) - 1)
 
getAttribute = val
 
End Function

가끔 VBA로 크롤링을 하다보면, HTML Object로 컨트롤하지 않고 HTML 코드를 쌩으로 가공하는게 편리할 때가 있습니다.^^;ㅎㅎ

그럴 때 가끔 사용하던 보조함수인데 도움이 되셨으면 좋겠습니다.

사용법은 간단합니다.

HTML 코드에서 a 태그를 파싱하려면

Dim aTags As Variant
aTags = getElementsByTag(HTML코드,"a")

특정 요소를 파싱하려면

Dim attVar As Variant
attVar = getAttribute(HTML코드,"href")

이런 식으로 사용하시면 됩니다!^^

회원등급 : 30레벨
포인트 : 16837 EP
전체 6

  • 2021-11-10 04:13

    XMLHTTP로 보낸 응답 내용을 파싱 할 때 매우 유용할 듯 합니다.
    Response로 HTML이 날라오면 어쩔 수 없이 해야 하는 과정이니 굿입니다. 제 개인 library에 추가.... 공개하면 출처는 반드시 명시합니다. ㅎㅎ

    iframe 태그 안의 html을 손 쉽게 파싱 할 방법이 있을까요?

    현재 제가 사용하는 방식은

    Set HTMLDoc = IE.Document
    Set iframeDoc = HTMLDoc.frames(.iIndex).Document
    Set elmt = iframeDoc.querySelector(.eSelector)

    CSS Selector가 매우 편해서 주로 사용 하는데, iframe 안의 태그는 잡아 주지를 못해서 어쩔 수 없이 iframe 안의 html은 새로이 document 객체를 받아 처리 하고 있습니다.

    답하시기 곤란할 수 있는 질문인데, capcha 혹은 recapcha를 VBA로 bypass 할 방법이 있을까요? JS는 문제가 아닌데, 엑셀로는 한계를 느껴서 좌절 중입니다. 이 부분 때문에, 포스팅도 못하고... ㅠㅠ
    근 1주일을 씨름 중입니다.

    공개적으로 답하기 곤란하시면 draphoe@hanmail.net 으로 지식 공유 좀 부탁 드릴게요. 1주일 동안 끙끙 거리면서... 사경을 해메고 있습니다. 내용은 절대 공개하지 않도록 하겠습니다.


    • 2021-11-11 19:30

      @dra**** 님 iframe이 css 로 처리가 안되는 건 몰랐네요..!

      캡챠는 VBA 만으로는 해결이 많이 어렵지 않을까 싶습니다.

      1세대 캡챠라면 화면 인식으로 해결할 수 있고.. 2세대 문자형 캡챠는 파이썬에서 제공되는 여러 라이브러리를 쓰면 해결할 수 있지만, 퍼즐을 선택하는 캡챠는.. 해결할 수 있을지 모르겠네요.

      캡챠가 트리거되는건 플랫폼마다 설정이 다른 걸로 알고 있습니다. 요즘 IE는 제한된 곳이 많아서, 아마 셀레니움으로 크롬을 끼고 받아오면 해결될 수 있지 않을까 생각됩니다.^^;


      • 2021-11-12 11:39

        @오빠두엑셀 님 iframe 안의 document는 통상적인 방법으로는 못 받고, 반드시 frames(index) 메서드를 사용해야만 객체로 반환이 됩니다. 그럴게 독립된 객체로 받으면 css 선택자가 먹힙니다. 문제는 페이지마다 iframe 갯수가 달라 매번 index 매기는 파싱을 따로 해야해서, 그에 따른 로직을 달리 해야 해서... 메인 html 문서에서 css 선택자가 먹히면 참 좋을 텐데...  하는 마음에.

        구글의 capcha 목적이 OCR 문서 읽기를 AI 자동 학습을 위한 것인데, 이미 그 목적을 달성했고, 퍼즐형 reCapcha는 사물 인식을 AI한테 훈련 시키기 위한 목적이라 하는데... 크롬 개발자 도구 앱으로 이미 존재 합니다. 야들이 문제가 아니고,,, kCapcha같은 다른 회사의 것들. 하다 안되면, VBA로 python하고 연동해서 처리 해야 할 듯.... ㅠㅠ


        • 2021-11-16 21:18

          @dra**** 님 네 맞습니다.

          VBA에서 사용할 수 있는 라이브러리가 제한적이다 보니.. 파이썬이랑 접목하시면 좋을 것 같습니다.

          kCapcha 가 따로 있는 건 처음 알았네요..^^;ㅎㅎ


  • 2021-11-14 15:14

    감사합니다!


  • 2021-11-10 20:34

    감사합니다.


전체 48
번호 제목 작성자 작성일 추천 조회
23999
[엑셀 VBA] Snippet - Public IP, Local IP, Mac Address 구하기 (4)
dra**** | 2021.11.25 | 추천 1 | 조회 37
dra**** 2021.11.25 1 37
23794
[엑셀 VBA] Snippet - 변수를 clipboard로 복사하기 (5)
dra**** | 2021.11.21 | 추천 2 | 조회 58
dra**** 2021.11.21 2 58
23337
HTML 라이브러리 사용하기 귀찮을 때, 사용하는 파싱함수 (getElementsByTag, getAttribute) (6)
트로피 오빠두엑셀 | 2021.11.09 | 추천 0 | 조회 76
트로피 오빠두엑셀 2021.11.09 0 76
23142
[잡설] 엑셀을 이용한 웹 자동화: SEO 이야기 (10)
dra**** | 2021.11.04 | 추천 0 | 조회 160
dra**** 2021.11.04 0 160
22802
[잡설] 웹 서버에서 내보내는 엑셀 파일 및 데이터 이야기 (6)
dra**** | 2021.10.25 | 추천 0 | 조회 112
dra**** 2021.10.25 0 112
22325
[엑셀 VBA] 파워쿼리 자동화 4. CRUD (3)
dra**** | 2021.10.12 | 추천 1 | 조회 150
dra**** 2021.10.12 1 150
22161
[엑셀 VBA] 파워쿼리 자동화 3. MySQL Class (8)
dra**** | 2021.10.07 | 추천 0 | 조회 172
dra**** 2021.10.07 0 172
21839
[엑셀 VBA] 파워쿼리 자동화 2. 자동화 실습 (8)
dra**** | 2021.09.28 | 추천 0 | 조회 227
dra**** 2021.09.28 0 227
21764
[엑셀 VBA] 개체 Reference - QueryTable Object 첨부파일 (2)
dra**** | 2021.09.26 | 추천 0 | 조회 96
dra**** 2021.09.26 0 96
21675
[엑셀 VBA] 파워쿼리 자동화 1. 자동화 순서 (8)
dra**** | 2021.09.23 | 추천 0 | 조회 403
dra**** 2021.09.23 0 403
21496
[엑셀 VBA] 개체 Reference - ADODB.Recordset : Database 필수 첨부파일 (4)
dra**** | 2021.09.16 | 추천 1 | 조회 192
dra**** 2021.09.16 1 192
21491
[잡설] IT가 흘러가고 있는 방향에 대한 단상 - 무엇을 공부해야 하는가? (21)
dra**** | 2021.09.16 | 추천 4 | 조회 220
dra**** 2021.09.16 4 220
21482
[엑셀 VBA] MySQL 02. Range -> 배열 -> INSERT (5)
dra**** | 2021.09.16 | 추천 0 | 조회 203
dra**** 2021.09.16 0 203
21412
[엑셀 VBA] MySQL 01. 워크시트 Custom Properties 활용하기 (4)
dra**** | 2021.09.14 | 추천 1 | 조회 114
dra**** 2021.09.14 1 114
20740
[엑셀 VBA] 개체 Reference - ListObject Object - [표]가지고 놀기 첨부파일 (12)
dra**** | 2021.08.29 | 추천 4 | 조회 224
dra**** 2021.08.29 4 224
20211
[엑셀 VBA] Windows API - winuser.h : 윈도우즈 프로그램의 핵심 첨부파일 (8)
dra**** | 2021.08.17 | 추천 3 | 조회 204
dra**** 2021.08.17 3 204
20194
[잡설] 엑셀이 웹으로 가야 하는 이유 (23)
dra**** | 2021.08.16 | 추천 12 | 조회 478
dra**** 2021.08.16 12 478
20153
[엑셀 VBA] 개체 Reference - FileSystem Object 첨부파일 (3)
dra**** | 2021.08.15 | 추천 1 | 조회 141
dra**** 2021.08.15 1 141
19717
[엑셀 VBA] 데이터 자동화 - 웹에서 제공하는 MySQL Sever를 이용한 자동화 개념 (15)
dra**** | 2021.08.05 | 추천 2 | 조회 344
dra**** 2021.08.05 2 344
19715
[엑셀 VBA] 개체 Reference - APPLICATION Object 첨부파일 (2)
dra**** | 2021.08.05 | 추천 0 | 조회 118
dra**** 2021.08.05 0 118