2017-09-14 7 views
0

나는 morningstar의 웹 사이트로 자금 크기를 업데이트하려고합니다. IE 자동화를 사용한 이전 시도가 작동하지 않아 XML httpRequest로 전환했습니다 (작업 속도도 훨씬 빨라졌습니다). 이제 웹 사이트에서 얻은 문서에서 올바른 라인을 인쇄하는 데 어려움을 겪고 있습니다. 코드에서 "tr"태그 내의 3 번째 "td"태그를주는 코드를 원한다면 "td"태그는 "Fund Size (Mil)"라고합니다. 그래서 코드는 모든 "td"태그의 표제를 반복하고 그걸 찾으면 액션으로 뛰어납니다. "{line heading}" = "Fund Size (Mil)". 이제 이것이 문제입니다. 나는이 표제를 말하는 법을 모른다.VBA의 HTML 구문 분석

각 "td"태그를 변수로 설정하려고했습니다. "tr"태그에 3 개의 "td"태그가 있기 때문에 각 "td 태그"에 대해 변수 row1, row2, row3이 있습니다.)하지만 난 지금이 ​​작업을 수행 할 때, 내가 얻을 오류 438 런타임 : I Debug.Print TDElement.innerHTML, 나는 보이지 않는 경우 객체가

Debug.Print TDElements.getElementsByTagName("tr")(0).Cells(0).innerHTML 

또한 라인이 속성 또는 메서드를 지원하지 않습니다 내가 필요한 "td"태그들. 대신에 .innerText을 넣으면 모든 "td"태그를 볼 수 있습니다.

이제 질문은 다음과 같습니다. 1) 머리글을 직접 참조하려면 어떻게해야합니까? (아래 코드 라인 For Each 내의주석이 달린 코드 라인을보십시오.) 2) .innerHTML로 모든 td 태그를 볼 수없는 이유는 무엇입니까?하지만 .innerText로 볼 수 있습니다.

URL http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW 엑셀 2010, IE 버전 (11)

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

Dim myurl As String 
Dim TDElement As Object 
Dim TDElements As IHTMLElementCollection 
Dim IE As MSXML2.XMLHTTP60 

Dim HTMLDoc As MSHTML.HTMLDocument 
Dim HTMLBody As MSHTML.HTMLBody 

Set IE = New MSXML2.XMLHTTP60 
Set HTMLDoc = New MSHTML.HTMLDocument 
Set HTMLBody = HTMLDoc.body 


myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
IE.Open "GET", myurl, False 
IE.send 

HTMLBody.innerHTML = IE.responseText 

Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     Debug.Print TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
'  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
'   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
    Next 


End Sub 

H2SO4의의 위의 문제를 해결 대답합니다. 아래는 초기 질문에 대한 확장입니다.

이제 TDElement에 몇 줄의 텍스트가 할당되었습니다 (h2so4의 값 10을 3으로 바꿨으므로 자금이 문자열을 찾으면 코드가 다음 3 줄을 표시합니다). 어떻게하면 더 파싱 할 수 있습니까? 현재 줄 Worksheets("helper").Cells(x, 6).Value = Split(TDElement.innerText, " ")(1)은 필자가 필요로하는 값 (769.28)을 반환하지만, 앞으로 정확히 무엇이 일어나는지 정말로 이해한다면 도움이 될 것입니다.

운동을 위해서, 어떻게 3 줄 모두를 자신의 세포에 인쇄 할 수 있습니까? 결과는 다음과 같습니다 : 기금 규모 (밀), 31/08/2017, 769.28 세포 (x, 6), (x, 7), (x, 8). TDElement에 "Split"또는 "Left"함수를 사용하면 함수는 위의 다른 행이 아니라 마지막 행만 대상으로합니다. 그러나, 내가 Debug.Print TDElement.innerText/.innerHTML 일 때, 나는 또한 다른 라인을 본다. 그렇다면 마지막 행 위의 행에 어떻게 접근 할 수 있습니까?

Debug.Print TDElement.innerText

출력 :

기금 크기 (밀)

31/08/2017

EUR 769.28

답변

0

다음 코드는 당신이 "펀드 사이즈"라인

에 얻을 것이다
Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

    Dim myurl As String 
    Dim TDElement As Object 
    Dim TDElements As IHTMLElementCollection 
    Dim IE As MSXML2.XMLHTTP60 
    Dim Flag As Boolean 
    Dim HTMLDoc As MSHTML.HTMLDocument 
    Dim HTMLBody As MSHTML.HTMLBody 
    Dim k As Long 
    Set IE = New MSXML2.XMLHTTP60 
    Set HTMLDoc = New MSHTML.HTMLDocument 
    Set HTMLBody = HTMLDoc.body 


    myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
    IE.Open "GET", myurl, False 
    IE.send 

    HTMLDoc.body.innerHTML = IE.responseText 
    Flag = False 
    k = 0 
    Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     If InStr(TDElement.innerText, "Fund Size") <> 0 Or Flag Then 
      'if fundsize string is found, display the next 10 lines 
      Debug.Print ":" & TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
      '  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
      '   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
      k = k + 1 
      If k < 10 Then Flag = True Else Flag = False 
     End If 
    Next 


End Sub 
+0

정말 고마워요! 이 작동합니다.새 정수 변수 n을 선언하고 10 대신 3을 설정하여 코드를 수정했습니다 (필요한 행만 대상으로 함). 그러나 나는 코드가 반환하는 마지막 행만 구문 분석 할 수있는 이유를 알고 싶습니다. 위의 초기 질문 ** ** 확장을 참조하십시오. – Samppa

0

확장 프로그램에 대한 답변을 얻으려면 nswer는 페이지가 설계된 방식에 따라 다릅니다. 여기에 3 가지 다른 셀에서 데이터를 가져올 수있는 가능한 솔루션이 있습니다.

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

    Dim myurl As String 
    Dim TDElement As Object 
    Dim TDElements As IHTMLElementCollection 
    Dim IE As MSXML2.XMLHTTP60 
    Dim Flag As Boolean 
    Dim HTMLDoc As MSHTML.HTMLDocument 
    Dim HTMLBody As MSHTML.HTMLBody 
    Dim k As Long, text 
    Set IE = New MSXML2.XMLHTTP60 
    Set HTMLDoc = New MSHTML.HTMLDocument 
    Set HTMLBody = HTMLDoc.body 


    myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
    IE.Open "GET", myurl, False 
    IE.send 

    HTMLDoc.body.innerHTML = IE.responseText 
    Flag = False 
    k = 0 
    Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     If InStr(TDElement.innerText, "Fund Size") <> 0 Or Flag Then 
      'if fundsize string is found, display the next 10 lines 
      text = Split(TDElement.innerText, vbLf) 
      If text(0) <> "" Then 
       Worksheets("Sheet3").Cells(3, k + 2).Resize(, UBound(text) + 1) = text '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
       '  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
       '   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
      End If 
      k = k + 1 
      If k < 3 Then Flag = True Else Flag = False 
     End If 
    Next 
End Sub