我已经使用这个简单的子程序从网上加载HTML文档一段时间了,没有任何问题:
Function GetSource(sURL As String) As Variant
' Purpose: To obtain the HTML text of a web page
' Receives: The URL of the web page
' Returns: The HTML text of the web page in a variant
Dim oXHTTP As Object, n As Long
Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
oXHTTP.Open "GET", sURL, False
oXHTTP.send
GetSource = oXHTTP.responsetext
Set oXHTTP = Nothing
结束功能
但我遇到的情况是,它大部分时间只加载部分页面(并非总是如此 - 有时会加载所有预期的HTML代码)。如果您从浏览器将页面的HTML保存到Web上的另一个文件,子程序将始终读取它没有问题。
我猜测问题是计时 - 动态页面在脚本仍在填写细节时注册“完成”。有时它会及时完成,有时则不会。
有没有人曾经遇到过这种行为并超越它?似乎应该有一种通过MSXML2.XMLHTTP对象捕获的方法,如果进入该页面并选择了保存到HTML选项,那么就是你得到的。
如果您希望自己查看此行为,请参阅以下页面的示例:
http://www.tiff.net/festivals/thefestival/programmes/specialpresentations/mr-turner
这是同一页面保存的HTML文件:
http://tofilmfest.ca/2014/film/fest/Mr_Turner.htm
是否有任何已知的解决方法?
答案 0 :(得分:2)
我找到了一种解决方法,可以满足我的需求。我以编程方式控制Internet Explorer并在我告诉它导航到页面以使内容完成加载后调用三秒钟的延迟。然后,我使用Microsoft的HTML库中的IHTMLElement提取HTML代码。它并不漂亮,但它检索了我尝试过的每个页面的所有HTML代码。如果有人有更好的方式来完成同样的目的,请随意炫耀。
Function testbrowser() As Variant
Dim oIE As InternetExplorer
Dim hElm As IHTMLElement
Set oIE = New InternetExplorer
oIE.Height = 600
oIE.Width = 800
oIE.Visible = True
oIE.Navigate "http://www.tiff.net/festivals/thefestival/programmes/galapresentations/the-riot-club"
Call delay(3)
Set hElm = oIE.Document.all.tags("html").Item(0)
testbrowser = hElm.outerHTML
End Function
Sub delay(ByVal secs As Integer)
Dim datLimit As Date
datLimit = DateAdd("s", secs, Now())
While Now() < datLimit
Wend
End Sub
答案 1 :(得分:1)
按照亚历克斯的建议,如果没有强力固定延迟,请按照以下步骤操作:
Function GetHTML(ByVal strURL as String) As Variant
Dim oIE As InternetExplorer
Dim hElm As IHTMLElement
Set oIE = New InternetExplorer
oIE.Navigate strURL
Do While (oIE.Busy Or oIE.ReadyState <> READYSTATE_COMPLETE)
DoEvents
Loop
Set hElm = oIE.Document.all.tags("html").Item(0)
GetHTML = hElm.outerHTML
Set oIE = Nothing
Set hElm = Nothing
End Function