无法使用VBA从跨度类获取值

时间:2018-12-09 11:13:22

标签: excel vba excel-vba

我正在尝试使用Excel VBA从网站上读取价格值,但出现错误

  

对象不支持此属性或方法

HTML的一部分

<div class="box-three box-right col-xs-20 col-lg-5 col-md-6 no-gutter">
<div class="inner-box-one">
<div class="price-container" itemprop="offerDetails" itemscope itemtype="http://data-vocabulary.org/Offer">
<span class="price-label">Τιμή:</span>
<span class="final-price"><span itemprop="price">594,00 €</span> </span>
<meta itemprop="currency" content="EUR" />
<meta itemprop="availability" content="in_stock" />
</div>

我正在尝试:

Dim getPrice As Object
Set getPrice = ie.Doc.getElementByClassName("final-price")
Dim myValue As String: myValue = getPrice.innerText
wks.Cells(i, "C").Value = myValue

我是这种代码的新手,所以请

2 个答案:

答案 0 :(得分:0)

Event Queue

答案 1 :(得分:0)

页面上有多少个,它是第一个吗?您的错误是因为您试图对集合中的单个元素使用一种方法,因为您没有使用集合中的索引来检索单个项目。

您可以通过以下方式返回所有匹配类的nodeList

Dim nodeList As Object, i As Long
Set nodeList = ie.document.querySelectorAll(".final-price")

然后按索引访问每个

For i = 0 To nodeList.Length-1
    Debug.Print nodeList.item(i).innerText
Next 

“。”是class css selector。它通过元素的类名来定位元素。两个类选择器之间的空格表示descendant combinator,表示第二个类必须是第一类的子代。

.price-container .price-label

您可能希望同时获取标签和价格:

Dim labels As Object, prices As Object, i As Long
Set labels = ie.document.querySelectorAll(".price-container .price-label")
Set prices = ie.document.querySelectorAll(".price-container .final-price")

For i = 0 To labels.Length - 1
    Debug.Print labels.item(i).innerText & " " & prices.item(i).innerText
Next

实际上,您可以进一步将其组合为:

Dim labelsPrices, i As Long
Set labelsPrices = ie.document.querySelectorAll(".price-container .price-label, .price-container .final-price")

For i = 0 To labels.Length - 1 Step 2
    Debug.Print labels.item(i).innerText & " " & prices.item(i + 1).innerText
Next

CSS选择器通过querySelectorquerySelectorAll方法(在这种情况下为.document)应用。第一个返回单个元素,即第一个匹配项,第二个返回所有匹配项。


单个项目:

您可以直接在上方使用代码的最后一部分来获取标签和价格,因为如果使用单个价格和单个标签,则会有两个元素。

Dim label As Object, price As Object, i As Long
Set label= ie.document.querySelector(".price-container .price-label")
Set price = ie.document.querySelectorAll(".price-container .final-price")

Debug.Print label.innerText, price.innerText