【问题标题】:extract figures from a html table out of yahoo finance | Excel VBA webscraping从yahoo Finance 的html 表格中提取数字| Excel VBA 网页抓取
【发布时间】:2020-10-03 15:46:06
【问题描述】:

您好,我需要有关此代码的帮助我正在尝试从此页面“收益历史记录”块中提取数据: https://finance.yahoo.com/quote/MSFT/analysis?p=MSFT

已经为此苦恼了 4 个小时。非常感谢任何帮助/提示!

问候米兰

Dim objIE As InternetExplorer
Dim aEle As HTMLDocument
Dim y As Long
Dim x As String
Dim lastrow As Long

Set objIE = New InternetExplorer

objIE.Visible = True

lastrow = Sheets("Table5").usedrange.Row - 1 + Sheets("Table5").usedrange.Rows.Count


For y = 11 To lastrow Step 2

x = Sheets("Table5").Range("A" & y).Value
If x = "" Then
Exit Sub
Else
objIE.navigate "https://finance.yahoo.com/quote/" & x & "/analysis?p=" & x

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop

        For Each aEle In objIE.document.getElementsByClassName("BdT Bdc($seperatorColor)")
    
        'On Error Resume Next
        If InStr(aEle.innerText, "EPS Actual") > 0 Then
        Sheets("Table5").Range("T" & y).Value = aEle.Children(4).innerText
        Sheets("Table5").Range("U" & y).Value = aEle.Children(3).innerText
        Sheets("Table5").Range("V" & y).Value = aEle.Children(2).innerText
        Sheets("Table5").Range("W" & y).Value = aEle.Children(1).innerText

        Exit For
        End If
        Next
       
    
End If
Next y
End Sub

【问题讨论】:

  • 你试图从 Earnings History 表中解析什么?
  • 感谢您的留言!基本上是“EPS 实际”行中的数字

标签: excel vba web-scraping yahoo-finance


【解决方案1】:

您可以使用 xmlhttp 请求从该站点从表 Earnings History 中获取跨行 EPS Actua 的内容。你不需要去IE。试一试。

Sub FetchValue()
    Const Url$ = "https://finance.yahoo.com/quote/MSFT/analysis?p=MSFT&guccounter=1"
    Dim elem As Object, tRow As Object, S$, R&

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", Url, False
        .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
        .Send
        S = .responseText
    End With
    
    With CreateObject("HTMLFile")
        .write S
        For Each elem In .getElementsByTagName("tr")
            If InStr(elem.innerText, "EPS Actual") > 0 Then
                R = R + 1: Cells(R, 1) = elem.Children(1).innerText
                Cells(R, 2) = elem.Children(2).innerText
                Cells(R, 3) = elem.Children(3).innerText
                Cells(R, 4) = elem.Children(4).innerText
                Exit For
            End If
        Next elem
    End With
End Sub

【讨论】:

  • 谢谢!完美运行,将其嵌入我的代码中。用 'xmlhttp requests' 解析似乎比我的 IE 方法快得多。这在什么条件下适用,任何网站都可以通过这种方法提取吗?向你致以最诚挚的问候,米兰
  • 只有当您感兴趣的内容不是 javascript 繁重时,您才可以使用 xmlhttp 请求抓取任何站点。确定任何内容是否是动态的最简单方法是在页面源中看起来相同。谢谢。
  • 嗨,辛!您是否知道为什么这种方法会显示此网站上的表格错误:link 我需要表格最后一行的值(以“Recom”开头),但我的孩子们遇到了这个错误(x ) 行:对象变量或未设置块变量
  • ` With CreateObject("HTMLFile") .write S For Each elem In .getElementsByTagName("tr") If InStr(elem.innerText, "Recom") > 0 Then Sheets("Tabelle5") .Range("AD" & y) = elem.Children(1).innerText Sheets("Tabelle5").Range("AE" & y) = elem.Children(3).innerText End If Next elem End With `
  • 嗨,米兰,考虑创建一个新帖子来描述您当前的需求,因为您尝试使用的网站与您在此处提出的问题不同。谢谢。
【解决方案2】:

我喜欢从 get hub 使用 VBA Seleniumbasic Chromedriver 的建议。我发现它更容易使用。然后,您可以使用 Chrome 扩展 RUTO XPath Finder,在页面上查找元素和表引用的 XPath。然后只需引用xpath。两者都可以在没有管理员权限的情况下安装。

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多