【问题标题】:Extract Data with Selenium and VBA使用 Selenium 和 VBA 提取数据
【发布时间】:2020-12-16 09:06:23
【问题描述】:

我是使用硒的新手。我有一个与 IE 不兼容的网站,所以我决定尝试这种新技术,但看不出我的代码有什么问题。任何帮助将不胜感激。

 Sub ExtractPrice()
    
        Dim bot As WebDriver, myproducts As WebElements, myproduct As WebElement
        Set bot = New WebDriver
        bot.Start "chrome"
        bot.Get "https://www.veadigital.com.ar/prod/72060/lechuga-capuchina-por-kg"
    '    Application.Wait Now + TimeValue("00:00:20")
        Set myproducts = bot.FindElementsByClass("datos-producto-container")
    '
    For Each myproduct In myproducts
    If myproduct.FindElementByClass("product-price").Text <> "" Then
    'Debug.Print myproducts.FindElementByClass("product-price").Text
        Worksheets("VEA").Range("b2").Value = myproducts.FindElementsByClass("product-price").Text
        End If
    Next
    
    MsgBox ("complete")
    End Sub

【问题讨论】:

  • 但是问题是什么?您收到什么错误消息?
  • Worksheets("VEA").Range("b2").Value 被硬编码为 b2? - 当您完成循环时,您将永远写入该单元格...除此之外,您需要描述正在发生的事情以及您期望发生的事情,并提供足够的支持信息,以便我们了解您的问题。
  • Rich 先生,它假设如果它有效,它应该给我价格(这就是我需要的),它属于“产品价格”类,但它没有。我只想要这个元素,但如果问题是“b2”,它应该在调试时带来它,而且它什么也没给我带来
  • @rahul rai,没有错误,只是没有带来任何数据
  • 似乎是同步问题。您需要在交互元素之前提供一些明确的等待。Set myproducts = bot.FindElementsByClass("datos-producto-container")

标签: vba selenium selenium-webdriver web-scraping


【解决方案1】:

问题出在这一行:

Worksheets("VEA").Range("b2").Value = myproducts.FindElementsByClass("product-price").Text

记住FindElements,返回一个webelements列表而不是webelements。 Instaead 使用您在 if 条件中使用的行。

Worksheets("VEA").Range("b2").Value=myproduct.FindElementByClass("product-price").Text 

Note : 使用上面的代码行,您将获得您的价格,但价格将是 $379 而不是 $3.79。因为没有。在页面上的价格。存储价格的更好方法是:

Dim intValue = myproduct.FindElementByClass("product-price").Text
Dim decValue=   myproduct.findElementByXPath(".//div[@class='product-price']//span").Text
Worksheets("VEA").Range("b2").Value = Replace(intValue , decValue, "."&decValue)

以上将分配 3.79 美元。

【讨论】:

  • 感谢您的回复。不能让它给我带来价格数据,我尝试了你给我的两种方法。价格是 92 美元,今天没有小数,我不知道它是否会变得复杂,第一种方法可能是我的代码有问题。
  • 在您建议的编辑中,我仍然可以看到您使用的是 myproducts.FindElementByClass("product-price").Text 而不是 myproduct。 FindElementByClass("product-price").Text。请注意此处 myproducts 指的是此处的列表,myproduct 指的是 webelement。请尝试使用确切的代码。
  • 亲爱的拉胡尔。感谢您的帮助。我终于可以用你的建议来做这件事了。我无法理解的一件事,有一些链接如果你输入手册显示价格,这是真实价格,并且通过 scrypt 输入它显示的价格非常不同,如果你在 url 关闭之前尝试快速检查它来自同一个 div 类,它只发生在某些产品上,会发生什么?我会给你和例子veadigital.com.ar/prod/109704/mandarina-promocion
  • @Marina 当然,我会看看并尝试复制您的问题。只有一个建议。如果您的原始问题得到解决,请接受并投票以表示感谢。谢谢和欢呼!!!
  • @MarinaMontero 使用手动 url 给出不同的速率和自动化脚本给出不同的重新分级您的问题。它不应该是这样的。正如我尝试使用 URL veadigital.com.ar/prod/109704/mandarina-promocion 一样,我在两种情况下都得到了相同的价格 15.99 美元。对于第二个问题,它完全失败,除非这些是 HTML DOM 中的一些变化,否则它不应该失败。同样最重要的是作为堆栈溢出的实践,一旦原始问题得到解决,您应该接受/赞成答案**。对于新问题,您应该通过发布一个新问题来开始一个新线程。干杯!!!
猜你喜欢
  • 1970-01-01
  • 2020-10-23
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
相关资源
最近更新 更多