当我尝试使用变量来指定要使用的类列表中的哪个元素时,我得到“对象不支持此属性或方法”(运行时错误“438”)错误。
For tdNum = 0 To 1000
If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then
Cells(cell, 2).Value = document.getElementsByClassName("prod-somm")(tdNum).getElementById("col-action").getElementsByTagName("span")(0).innerText
Exit For
End If
Next tdNum
HTML:
<table align="center" cellspacing="0" class="prod-somm">
<tbody>
<tr>
<td align="center" rowspan="2" class="prod-somm-image"></td>
<td class="prod-somm-texte" valign="top">
<a href="/eng/Balance-of-system/Fuse-and-holder/Wohner-31110.000/p/284" id="no-piece">
90-FT017
<span class="prod-somm-sepno"></span>
<span id="panier_fab_284">Wohner</span>
<span id="panier_nomanufact_284">31110.000</span>
</a>
<a href="/eng/Balance-of-system/Fuse-and-holder/Wohner-31110.000/p/284"></a>
</td>
</tr>
<tr>
<td id="col-action">
<div class="prix">
<span id="panier_prix_284">10.43</span>
</div>
</td>
</tr>
</table>
问题发生在If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then
目标是让程序在搜索结果列表中运行,直到找到与我的Excel电子表格中的项目编号匹配的项目编号,然后获取与该项目对应的价格。
修改 这是整个代码。可能会让我想要做的更清楚一些。
Option Explicit
Function priceGetRematek()
Dim XMLHttpRequest As New MSXML2.XMLHTTP60
Dim xhr As MSXML2.XMLHTTP60
Dim cell As Integer
Dim tdNum As Integer
Dim ItemNbr As String
Dim document As MSHTML.HTMLDocument
'Login to Rematek
With XMLHttpRequest
.Open "POST", "https://rematek-energie.com/eng/customer-login/account-authentication.php", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send "name_se_connecter=se_connecter&zebra_honeypot_se_connecter=&courriel=rob@solacity.com&motpasse=password&connexion=Sign in"
End With
'Debug.Print XMLHttpRequest.responseText
'Get Price Element from HTML
Set xhr = New MSXML2.XMLHTTP60
For cell = 2 To 38
ItemNbr = Cells(cell, 1).Value
With xhr
.Open "POST", "https://rematek-energie.com/eng/pg/1/r/" & ItemNbr, False
.send
'Debug.Print xhr.responseText
If .readyState = 4 And .Status = 200 Then
Set document = New MSHTML.HTMLDocument
document.body.innerHTML = .responseText
For tdNum = 0 To 1000
If document.getElementsByClassName("prod-somm")(tdNum).getElementById("no-piece").innerText = ItemNbr Then
Cells(cell, 2).Value = document.getElementsByClassName("prod-somm")(tdNum).getElementById("col-action").getElementsByTagName("span")(0).innerText
Exit For
End If
Next tdNum
Else
MsgBox "Error" & vbNewLine & "Ready state: " & .readyState & vbNewLine & "HTTP request status: " & .Status
End If
End With
Next cell
End Function
答案 0 :(得分:1)
方法getElementById
仅适用于html文档,而不适用于html元素。
但是由于你有重复的id,这里你最好的选择可能就是使用querySelector
来获取目标元素。
请注意,该标准强制使用唯一ID,但不会在浏览器中强制执行。
以下是一个可以帮助您入门的示例:
' execute the query
Dim xhr As New MSXML2.XMLHTTP60
xhr.Open "GET", "https://rematek-energie.com/eng/pg/1/r/5", False
xhr.send
' load the html
Dim html As New HTMLDocument, html2 As Object
Set html2 = html
html2.write xhr.responseText
' scrap the html
Dim elements As MSHTML.IHTMLElementCollection
Dim element As MSHTML.IElementSelector
Dim link As IHTMLElement
Set elements = html.getElementsByClassName("prod-somm")
For i = 0 To elements.Length - 1
Set element = elements(i)
' get the link with id="no-piece"
Set link = element.querySelector("a[id='no-piece']")
If Not link Is Nothing Then
' display the product code
Debug.Print link.FirstChild.data
End If
Next