我使用excel和VBA打开一个页面,提取一些信息并将其放入数据库。经过一番研究,我发现打开IE显然需要更多的时间,而且可以使用XmlHTTP来实现。我正在使用XmlHTTP打开另一个问题中提出的网页。然而,在使用IE时,我能够浏览div标记。如何在XmlHTTP中实现相同的功能?
如果我使用IE打开页面,我将执行以下操作来浏览多个div元素。
Set openedpage1 = iedoc1.getElementById("profile-experience").getElementsbyClassName("title")
For Each div In openedpage1
---------
但是,使用XmlHttp,我无法执行以下操作。
For Each div In html.getElementById("profile-experience").getElementsbyClassName("title")
我收到一个错误,因为对象不支持此属性或方法。
看看我为另一个问题发布的这个答案,因为这接近你想要的。总之,您将:
-
创建
Microsoft.xmlHTTP
对象 -
使用xmlHTTP对象打开您的url
-
将响应作为XML加载到
DOMDOcument
对象中
从那里您可以获得一组XMLNodes
,从DOMDocument
中选择元素、属性等
XMLHttp对象在responseText
中以字符串形式返回页面内容。您需要解析此字符串以查找所需的信息。Regex是一种选择,但它会非常麻烦。
此页面使用字符串函数(Mid、InStr)从html文本中提取信息。
也许可以从检索到的HTML中创建DOMDocument(我相信是这样),但我还没有追求这一点。
如上所述,将.responseText
放入HTMLDocument中,然后使用该对象,例如
Option Explicit
Public Sub test()
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", "http://www.someurl.com", False
.send
html.body.innerHTML = .responseText
End With
Dim aNodeList As Object, iItem As Long
Set aNodeList = html.querySelectorAll("#profile-experience.title")
With ActiveSheet
For iItem = 0 To aNodeList.Length - 1
.Cells(iItem + 1, 1) = aNodeList.item(iItem).innerText
'.Cells(iItem + 1, 1) = aNodeList(iItem).innerText '<== or potentially this syntax
Next iItem
End With
End Sub
注:
我已经把你的getElementById("profile-experience").getElementsbyClassName("title")
翻译成了一个CSS选择器querySelectorAll("#profile-experience.title")
,所以假设你做得正确。