首页 > 解决方案 > 没有此类元素错误。使用 VBA 找不到 XPath 的元素

问题描述

我正在尝试从tipranks.com 上的股票中提取分析师的建议

我有一个电子表格来放置对股票提出买入、持有和卖出建议的分析师数量。我使用 Selenium 和 ChromeDriver 打开网站,然后找到值(每个建议的分析师数量)并复制到电子表格中。

代码在尝试复制第一个值之前一直有效。它说它找不到元素。

“未找到 XPath [XPath 方向] 的元素”

如果我在代码因错误而暂停时复制完整的 XPath,从程序打开的 Chrome 窗口中再次粘贴并单击继续,则程序将顺利运行,并会在网站上找到其余元素尽管 XPath 与我之前使用的相同。

问题似乎是当我运行程序时它试图找到第一个 XPath 元素时,不管我试图找到的元素是什么,一旦我解决了它就会找到其余的元素。

Dim obj As New WebDriver
Dim xyz As WebElement
Dim destino As Range
obj.Start "chrome", ""
obj.Get "https://www.tipranks.com/stocks/aapl/forecast"

Application.Wait (Now + TimeValue("0:00:5"))

Dim BUYs As Range
Set BUYs = ActiveCell
BUYs = obj.FindElementByXPath("/html/body/div[1]/div/div/div[2]/article/div[2]/div/main/div[1]/section/div[2]/div[1]/div[2]/div/div[2]/div/ul/li[1]/span[2]/b").Text
ActiveCell.Offset(0, 1).Select
Set HOLDs = ActiveCell
Dim HOLDs As Range
HOLDs = obj.FindElementByXPath("/html/body/div[1]/div/div/div[2]/article/div[2]/div/main/div[1]/section/div[2]/div[1]/div[2]/div/div[2]/div/ul/li[2]/span[2]/b").Text
ActiveCell.Offset(0, 1).Select
Dim SELLs As Range
Set SELLs = ActiveCell
SELLs = obj.FindElementByXPath("/html/body/div[1]/div/div/div[2]/article/div[2]/div/main/div[1]/section/div[2]/div[1]/div[2]/div/div[2]/div/ul/li[3]/span[2]/b").Text

标签: excelvbaseleniumweb-scrapingxpath

解决方案


我无法在 VBA 中进行测试,但以下是来自 python 的翻译,其中我使用 css 选择器来定位所需的元素。我以父节点为目标,这样我就可以按空间分割以生成描述和值,例如购买 19。这应该可以避免 xpath 出现的问题。

Dim items As WebElements, item As WebElement, tempArr() As String, arr() As Variant, r As Long
ReDim arr(1 To 3, 1 To 2)

items = obj.FindElementByCss('.client-components-pie-style__legend span + span')
For Each item in items
    r = r + 1
    tempArr = split(item.text, ' ') 
    arr(r, 1) = tempArr(0)
    arr(r, 2) = tempArr(1)
Next

Activesheet.Cells(1,1).Resize(UBound(arr,1), UBound(arr,2)) = arr

你可怕的长 xpath 在第一个 div[2] 上绊倒了。我建议,如果您想坚持使用 xpath,请使用相对的、更健壮的路径。在匹配方面相当于我的 css 将是:

Dim items As WebElements

Set items = obj.FindElementsByXpath('.//*[@class="client-components-pie-style__legendColor"]/following-sibling::span')

推荐阅读