我正在使用VBA代码(在MS Access中,但无论VBA平台如何都应该出现这个问题)来抓取特定数据的特定网页:
Option Compare Database
Option Explicit
' Requires references to "Microsoft Internet Controls"
' Requires references to "Microsoft HTML Object Library"
Private mFound As Boolean
Private Sub cmdGetFromIE(BaseURL as string)
Const SND_ALIAS_SYSTEMEXCLAMATION = 8531
Dim SW As SHDocVw.ShellWindows
Dim IE As SHDocVw.InternetExplorer
Dim CtrA As Long
Dim TStart As Single
Dim Doc As MSHTML.HTMLDocument
Dim IncElement As MSHTML.IHTMLElement, TitleElement As MSHTML.IHTMLElement, UserElement As MSHTML.IHTMLElement
' ...
Set SW = New SHDocVw.ShellWindows
If SW.Count > 0 Then
For CtrA = 0 To SW.Count - 1
Set IE = SW.Item(CtrA)
If Left(IE.LocationURL, Len(BaseURL)) = BaseURL Then
TStart = Timer
IE.Refresh
Do Until (IE.ReadyState = READYSTATE_COMPLETE And Not IE.Busy) Or Timer > TStart + 30
DoEvents ' Sleep 1 ' Sleep Windows API call procedure to sleep 1s
Debug.Print IE.LocationName, IE.LocationURL, IE.ReadyState, IE.Busy
Loop
If IE.ReadyState = READYSTATE_COMPLETE And Not IE.Busy Then
Set Doc = IE.Document
Set IncElement = Doc.getElementsByClassName("history-item__title ng-binding").Item
Set TitleElement = Doc.getElementsByClassName("history-item__details ng-binding").Item
Set UserElement = Doc.getElementsByClassName("person-summary__full-name_link font-size-xxl ng-binding").Item
Debug.Print CtrA & ";" & Val(Right(IncElement.innerText, 12)) & ";" & TitleElement.innerText & ";" & UserElement.innerText
' Do stuff with the data...
End If
End If
Next
' Do more stuff with the data...
Else
' ... Do 'No IE open' stuff...
End If
End Sub
我的问题是,如果我打开Navigation Page A
,并从那里导航到Data Page B 1
,则会从该页面返回正确的数据,但如果我然后导航回Navigation Page A
然后导航到Data Page B 2
,它是相同的形式,但包含不同的数据,此代码返回Data Page B 2
的{{1}}的部分或全部相同数据,尽管数据页是刷新。
我甚至可以导航到Data Page B 1
,然后在新标签页中打开Navigation Page A
,然后返回Data Page B 1
标签,然后再打开Navigation Page A
另一个新标签,我仍然遇到问题,我从Data Page B 2
获得部分或全部Data Page B 1
数据。
Data Page B 2
似乎是一个Angular-JS填充的库存表单,根据URL的数据部分有不同的数据,但这无关紧要,我想要页面的数据,因为它就在我运行的那一刻该程序,但是我是否有我的代码执行Data Page B
,我仍然有这个问题。
如果我尝试IE.Refresh
,我会在Set Doc = New MSHTML.HTMLDocument:Set Doc = Doc.createDocumentFromUrl(IE.LocationURL, "")
收到“权限被拒绝”错误。
如何为每个IE标签抓取Doc.getElementsByClassName
以获取正确的当前数据?
编辑:
我甚至不一定要使用IE来加载页面,我只需要从IE获取 URL ,如果还有另一种方法可以通过VBA加载和解析结果HTML DOM将起作用,我愿意接受它。