MSHTML.HTMLDocument

时间:2019-02-24 20:49:04

标签: vba web-scraping vb6 microsoft.mshtml

仅当使用getElementsByClassName

时才会发生问题
Dim HTTP As New MSXML2.XMLHTTP60

HTTP.open "POST", strWWW, False
HTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0;     Windows NT 5.0)"
HTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
HTTP.send ("obj=" & strID)

Dim HTML As New MSHTML.HTMLDocument

HTML.body.innerHTML = HTTP.responseText

Dim eleCol As MSHTML.IHTMLElementCollection

Set eleCol = HTML.getElementsByClassName("listEvent sro") '<-- The problem is happening here.

正在Windows 8.1和Windows XP上进行测试

Windows 8.1

虽然在IDE中一切正常, 但仅在编译时出现错误:

Error on Windows 8.1

mshtml.dll 11.00.9600.18860

mshtml.tlb 11.0.9600.16518

该方法存在,但是现在为什么在IDE中可以使用它,而在编译时却不能呢?

Windows XP

即使在IDE中也不起作用,显示 以下错误消息:

enter image description here

mshtml.dll 8.0.6001.23588

mshtml.tlb 8.0.6001.18702(旧版本,没有getElementsByClassName)

mshtml.tlb 11.0.9600.16518(使用此版本,但不起作用)

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

尝试以下使用css选择器语法按类选择的变通办法。对于现代浏览器,这是一种用于元素匹配的更快方法。可能有用。

Dim eleCol As Object
Set eleCol = HTML.querySelectorAll(".listEvent.sro")

另外,测试您是否可以删除复合类用法并使用单个类,例如

Set eleCol = HTML.querySelectorAll(".listEvent")

您在返回的For Loop上使用从0.Length -1的{​​{1}}。

答案 1 :(得分:0)

您的提示已解决了问题。

我使用的节点列表...

Dim eleMen As MSHTML.IHTMLElement

For Each eleMen In eleCol
    debug.print eleMen.innerText
Next eleMen

...而且效果很好,不用时也一样 HTML.getElementsByClassName 我使用getElementsByTagName的量也只能正常使用 getElementsByClassName在可执行文件中显示此错误, 而不是在IDE中。

这是MSHTML中的错误吗?

另一个细节是,这也没有问题...

Set eleCol = HTML.querySelectorAll(".listEvent.sro").Item(0).getElementsByTagName("td")

...返回了我需要的所有节点。

非常感谢您!