我正尝试选择标签为("menu_wholesome")
的页面http://greyhoundstats.co.uk/index.php的主菜单ID,以便以后获得其超链接。在HTML文档中,有两个具有此ID的标签,一个<div>
及其子元素<ul>
,但是当我使用下面的代码搜索它们时,出现对象变量未设置的错误。
Option Explicit
Public Const MenuPage As String = "http://greyhoundstats.co.uk/index.php"
Sub BrowseMenus()
Dim XMLHTTPReq As New MSXML2.XMLHTTP60
Dim HTMLDoc As New MSHTML.HTMLDocument
Dim MainMenuList As MSHTML.IHTMLElement
Dim aElement As MSHTML.IHTMLElementCollection
Dim ulElement As MSHTML.IHTMLUListElement
Dim liElement As MSHTML.IHTMLLIElement
XMLHTTPReq.Open "GET", MenuPage, False
XMLHTTPReq.send
HTMLDoc.body.innerText = XMLHTTPReq.responseText
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")(0) '<-- error happens here
End Sub
任何人都知道为什么getElementsById尽管是HTML文档集中的一部分,但却找不到引用的ID?我知道此方法应该返回唯一的ID,但是当我们使用其他标签引用的ID相同时,我也知道我将返回找到的第一个ID,该ID应该是HTML页面的<div id="menu_wholesome">
部分请求。
答案 0 :(得分:1)
目前尚不清楚您要达到什么目标。我刚刚解决了您目前遇到的当前问题。 .getElementById() 处理单个元素,因此当您将其视为元素集合时,它将引发该错误。如果您注意到这部分 getElementBy 和 getElementsBy ,则可以看到哪个是以下项的集合的变体元素(不要忽略 s )。当您使用 getElementsBy 时,只能使用(0)
或类似的东西。
您应该以正确的方式缩进代码,以便其他人可以轻松阅读它:
Sub BrowseMenus()
Const MenuPage$ = "http://greyhoundstats.co.uk/index.php"
Dim HTTPReq As New XMLHTTP60, HTMLDoc As New HTMLDocument
Dim MainMenuList As Object
With HTTPReq
.Open "GET", MenuPage, False
.send
HTMLDoc.body.innerHTML = .responseText
End With
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")
End Sub
答案 1 :(得分:1)
首先:您要在遍历DOM文档时工作并设置innerHTML。
第二:此行
Set MainMenuList = HTMLDoc.getElementById("menu_wholesome")(0)
不正确。 getElementById
返回一个无法索引的元素。您可以索引到集合中。
请注意:div和ul导致相同的内容。
如果要单独选择它们,请使用querySelector
HTMLDoc.querySelector("div#menu_wholesome")
HTMLDoc.querySelector("ul#menu_wholesome")
首先按标签名称选择上述目标,然后使用id属性。
如果要收集ID,请使用querySelectorAll
返回匹配项的nodeList。 ID应该是页面唯一的,但有时不是!
HTMLDoc.querySelectorAll("#menu_wholesome")
然后您可以索引到nodeList中,例如
HTMLDoc.querySelectorAll("#menu_wholesome").item(0)
VBA:
Option Explicit
Public Const MenuPage As String = "http://greyhoundstats.co.uk/index.php"
Sub BrowseMenus()
Dim sResponse As String, HTMLDoc As New MSHTML.HTMLDocument
Dim MainMenuList As Object, div As Object, ul As Object
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", MenuPage, False
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
sResponse = StrConv(.responseBody, vbUnicode)
End With
sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
HTMLDoc.body.innerHTML = sResponse
Set MainMenuList = HTMLDoc.querySelectorAll("#menu_wholesome")
Debug.Print MainMenuList.Length
Set div = HTMLDoc.querySelector("div#menu_wholesome")
Set ul = HTMLDoc.querySelector("ul#menu_wholesome")
Debug.Print div.outerHTML
Debug.Print ul.outerHTML
End Sub