【问题标题】:Extracting data from website to excel error从网站提取数据到excel错误
【发布时间】:2019-01-01 02:49:36
【问题描述】:

我在设置从网站到 Excel 的数据提取时遇到了困难。 我想提取产品的确切价格以脱颖而出。 到目前为止,我有这个代码:

Sub GetData()

    Dim objIE As InternetExplorer  'Microsoft Internet Controls library added
    Dim itemEle As Object
    Dim data As String
    Dim y As Integer

    Set objIE = New InternetExplorer
    objIE.Visible = True

    objIE.navigate "https://www.nay.sk/samsung-ue55nu7172"
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    y = 1

    For Each itemEle In objIE.document.getElementsByClassName("price")
    data = itemEle.getElementsByClassName("price")(0).innerText
        y = y + 1
    Next
    data = Range("A1").Value
End Sub

你有什么建议?

【问题讨论】:

  • 我在 excel 中使用开发人员模式直接编写它,启用 VBS 并直接在那里编写 - 所以是的,Alt+F11
  • 我明白了。然后是 VBA,不是 VBS。
  • 你只追求一个价格吗?每个价格?您需要任何元信息来配合价格信息吗?
  • 我只需要一个价格:Cena v predajni

标签: vba excel web-scraping extraction


【解决方案1】:

你想要每个价格吗?

例如,您可以这样列出前两个:

Option Explicit
Public Sub GetInfo()
    Dim sResponse As String, i As Long, html As New HTMLDocument
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.nay.sk/samsung-ue55nu7172", False
        .send
        sResponse = StrConv(.responseBody, vbUnicode)
    End With
    sResponse = Mid$(sResponse, InStr(1, sResponse, "<!DOCTYPE "))
    Dim titles As Object, prices As Object
    With html
        .body.innerHTML = sResponse
        Set titles = .querySelectorAll(".title")
        Set prices = .querySelectorAll(".price")
    End With
    For i = 0 To 1
        Debug.Print titles(i).innerText & prices(i).innerText
    Next i
End Sub

那个循环返回给你这些:


实际上,页面上的所有元素都有一个 price 类存储在对象 prices 中。

您可以通过循环该对象/节点列表的长度来查看所有价格:

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

同样,您可以循环 titles.Length,但请注意它与 prices 的长度不同。页面上有更多的价格(或者更确切地说,具有 price 类的元素与具有 title 类的元素相比。


参考资料(VBE>工具>参考资料):

  1. HTML 对象库

【讨论】:

  • 另一个很棒的解决方案!我认为所有的网络抓取请求都应该发送给你 :-) 开个玩笑。
  • 在您为文件上传提供解决方案之后,这是我在 SO 上看到的最好的解决方案之一......
【解决方案2】:

试试这个:

Sub GetData()

    Dim objIE As New InternetExplorer   'Microsoft Internet Controls library added
    Dim itemEle As Object
    Dim data As String
    Dim y As Integer

    objIE.Visible = True

    objIE.navigate "https://www.nay.sk/samsung-ue55nu7172"
    Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

    y = 1

    For Each itemEle In objIE.document.getElementsByClassName("price")
        Cells(y, 1) = itemEle.outertext
        y = y + 1
    Next

End Sub

这就是你得到的:

要获得itemEle的正确属性:

  • 在打印屏幕下方的行上放置一个停止标志
  • 用鼠标选择itemEle
  • Shift+F9

【讨论】:

  • 谢谢。这行得通。能否请您解释一下,如何才能让“CENA V PREDAJNI”价格脱颖而出?
  • @robsik - 尝试 Shift + F9 并查找相应的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多