2017-02-01 4 views
0

VBA를 사용하여 웹 페이지로 이동하고 정보를 입력하고 단추를 클릭하고 다음 페이지로 이동 한 다음 결과 정보 일부를 수집하려고합니다. . 여기에 문제가 있습니다 : 코드는 처음 몇 단계를 거치지 만 두 번째 페이지의 html을 구문 분석하려고하면 첫 페이지에서 HTML을 반환합니다. 어떤 이유로 올바른 페이지가 원하는 정보와 함께 화면에 표시 되더라도 WebBrowser.Document의 HTML은 새 화면로드로 변경되지 않습니다. 나는 I.E.를 강요하려고 노력했다. 페이지가로드 될 때까지 기다리는 것이지만 아무런 차이가없는 것처럼 보입니다. 코드는 다음과 같습니다.VBA : 페이지에서 HTML 데이터 가져 오기

Sub SnowLoad(Latitude As String, Longitude As String, State As String) 


Dim MyHTML_Element As IHTMLElement 
Dim HTMLDoc As HTMLDocument 
Dim MyURL As String 
Dim SnowTag As String 
Dim SnowPos As Long 
SnowTag = "Load" 
On Error GoTo Err_Clear 
MyURL = "http://snowload.atcouncil.org/" 
''open new explorer 
Dim MyBrowser As New InternetExplorer 
MyBrowser.Silent = True 
''navigate to page 
MyBrowser.navigate MyURL 
MyBrowser.Visible = True 
''wait until ready 
Do 
DoEvents 
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE 

Set HTMLDoc = MyBrowser.document 
HTMLDoc.all.optionCoordinate_LATLON.Click 

HTMLDoc.all.coordinate_lat.Value = Latitude 
HTMLDoc.all.coordinate_lon.Value = Longitude 
Set elems = HTMLDoc.getElementsByTagName("button") 
    For Each e In elems 

     If (e.getAttribute("class") = "btn") Then 
      e.Click 
      Exit For 
     End If 

    Next e 

Do 
DoEvents 
Loop Until MyBrowser.readyState = READYSTATE_COMPLETE 

Set elems = HTMLDoc.getElementsByTagName("p") 

    For Each e In elems 
     Debug.Print e.innerHTML 
     If InStr(e.innerHTML, SnowTag) Then 
      SnowPos = InStr(e.innerHTML, SnowTag) 
      Range("SnowPosition").Value = SnowPos 
      Exit For 
     End If 

    Next e 

Err_Clear: 
If Err <> 0 Then 
Err.Clear 
Resume Next 
End If 

End Sub 

저는 제 2 페이지에 나와있는 정보를 얻는 방법을 알지 못합니다. Google 검색 결과에 대한 답변이 없거나 비슷한 문제가있는 것으로 보입니다. .navigate에 대한 실제 호출 대신 탐색 버튼을 사용하는 것과 관련 될 수 있습니까?

+0

우리가 HTML을 볼 수 있을까요? 그것은 두 가지 중 하나처럼 들리지만, 페이지가 실제로 코드를로드하더라도 실제로로드되지 않습니다. 새 페이지가 프레임/iFrame에 있습니다. 또는 웹 사이트 또는 HTML을 보는 것이 도움이 될만한 다른 것. –

+0

제대로 서식이 지정된 HTML을 원래 게시물로 가져 오는 방법을 알아낼 수 없습니다 (붙일 때 난파선이됩니다). 여기에 웹 사이트가 있습니다 : [Snow Link] (http://snowload.atcouncil.org/index.php/component/vcpsnowload/item) 나는 HTML에 익숙하지 않아서 잘 모르겠다. 그것의 무엇이든은 주목할 만하다. – Tsnorthern

+0

특정 지역에 대한 강설량의 psf를 반환하려고합니까? –

답변

1

나는이 작업을 겉으로보기에는 신뢰할 만하게하고 있습니다. 방금 문제없이 5 ~ 6 번 실행했습니다. 페이지가 새로 고쳐진 후에도 요소를 찾지 못했습니다. 이 문제를 해결하기 위해로드 후 객체에 대한 새로운 참조를 얻었습니다. 그것은 잘 작동하는 것처럼 보였다.

또한 코드에 대한 일반적인 정리를 수행했습니다.

#If VBA7 Then 
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 
#Else 
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
#End If 

Sub SnowLoad() 
On Error GoTo errhand: 
    'I hard coded these for testing 
    Latitude = "46" 
    Longitude = "-87" 

    Dim MyURL  As String: MyURL = "http://snowload.atcouncil.org/" 
    Dim element  As Object 

    ''open new explorer, I used late binding 
    Dim MyBrowser As Object: Set MyBrowser = CreateObject("InternetExplorer.Application") 
    MyBrowser.Visible = True 
    MyBrowser.navigate MyURL 

    'Wait for the browser to finish loading 
    waitForLoad MyBrowser 

    With MyBrowser.document 
     .getElementByID("optionCoordinate_LATLON").Click 
     .getElementByID("coordinate_lat").Value = Latitude 
     .getElementByID("coordinate_lon").Value = Longitude 
     .getElementsByName("btn-submit")(0).Click 
    End With 

    waitForLoad MyBrowser 

    'For whatever reason the HTML isn't updating along with the page 
    'Instead, I'm just getting an updated reference to the IE object with the 
    'below function, weird issue, but this seems to work 
    Set MyBrowser = FindWindow("component/vcpsnowload/item") 
    Set element = MyBrowser.document.Forms("adminForm").getelementsByTagName("p")(0) 
    Range("A1").Value = element.innertext 

    Exit Sub 
errhand: 
    MsgBox (Err.Number & " " & Err.Description) 
End Sub 

Public Function FindWindow(SearchCriteria As String) As Object 
    Dim window As Object 

    For Each window In CreateObject("Shell.Application").Windows 
     If window.locationurl Like "*" & SearchCriteria & "*" Then 
      Set FindWindow = window 
      Exit Function 
     End If 
    Next 

    Set FindWindow = Nothing 
End Function 

Public Sub waitForLoad(ByVal IE As Object) 
    Dim i As Byte 
    Sleep 500 ' wait a bit for the page to start loading 
    Do 
     i = i + 1 
     Sleep 500 
    Loop Until IE.readystate = 4 Or IE.busy = False Or i >= 20 
End Sub 

이상이 반환 코드 : Any elevation: Ground Snow Load is 60 psf

+0

문제 없으니 기꺼이 도와 드리겠습니다. 정말 이상한 문제는 내가 아는 한 그렇게해서는 안된다. 새로 고침이 완료되면 HTML이 업데이트되어야합니다. –

관련 문제