使用excelvba刮取HTML

使用excelvba刮取HTML,html,vba,excel,web-scraping,Html,Vba,Excel,Web Scraping,我一直在尝试从一个网站上搜集和分析一些财务数据,以便使用VBA将数据添加到Excel电子表格中。我已经找到了几种可能的解决方案,但我似乎无法使它们符合我的参数。我的问题是,我只需要一个表中的变量(平均目标价格)。我一直无法找出我做错了什么。我还将使用类似的VBA格式,一次检查数百家公司,因此,如果有更有效的方法来编码我所拥有的,请让我知道 以下是我到目前为止的情况: Sub ImportAnalystEst() Dim oHtml As HTMLDocument Dim oElem

我一直在尝试从一个网站上搜集和分析一些财务数据,以便使用VBA将数据添加到Excel电子表格中。我已经找到了几种可能的解决方案,但我似乎无法使它们符合我的参数。我的问题是,我只需要一个表中的变量(平均目标价格)。我一直无法找出我做错了什么。我还将使用类似的VBA格式,一次检查数百家公司,因此,如果有更有效的方法来编码我所拥有的,请让我知道

以下是我到目前为止的情况:

Sub ImportAnalystEst()

Dim oHtml       As HTMLDocument
Dim oElement    As IHTMLElement

Set oHtml = New HTMLDocument

With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", "http://www.marketwatch.com/investing/stock/aapl/analystestimates", False
    .send
    oHtml.body.innerHTML = .responseText
End With

Dim wsTarget As Worksheet
Dim i As Integer
i = 1
Set wsTarget = ActiveWorkbook.Worksheets("Sheet1")

For Each oElement In oHtml.getElementsByClassName("snapshot")
  wsTarget.Range("A" & i) = Split(oElement.Children(0).innerText, "<TD>")
  i = i + 1
Next

End Sub
次重要分析测试()
作为HTMLDocument的Dim oHtml
作为IHTMLElement的尺寸元素
设置oHtml=新HTMLDocument
使用CreateObject(“WINHTTP.WinHTTPRequest.5.1”)
.打开“获取”http://www.marketwatch.com/investing/stock/aapl/analystestimates”“错
.发送
oHtml.body.innerHTML=.responseText
以
将目标设置为工作表
作为整数的Dim i
i=1
设置wsTarget=ActiveWorkbook.Worksheets(“Sheet1”)
对于oHtml.getElementsByClassName(“快照”)中的每个oElement
wsTarget.Range(“A”&i)=拆分(oElement.Children(0.innerText)”)
i=i+1
下一个
端接头
这是我试图从中提取的HTML。有人能举个例子,说明我如何得出146.52的平均目标价格吗

<div class="analystEstimates">

<div class="block">
    <h2>Snapshot</h2>
</div>
<table class="snapshot">
    <tbody>
        <tr>
            <td class="first">Average Recommendation:</td>
            <td class="recommendation">
                Overweight
            </td>
            <td class="first column2">Average Target Price:</td>
            <td>146.52</td>
        </tr>
        <tr>
            <td class="first">Number of Ratings:</td>
            <td>

快照
平均建议:
超重
平均目标价格:
146.52
评级数量:

我通过以下方法解决了我的问题:

Sub ImportAnalystEst()
Dim oHtml       As HTMLDocument
Dim oElement    As IHTMLElement

Set oHtml = New HTMLDocument


With CreateObject("WINHTTP.WinHTTPRequest.5.1")
    .Open "GET", "http://www.marketwatch.com/investing/stock/aapl/analystestimates", False
    .send
    oHtml.body.innerHTML = .responseText
End With

Dim wsTarget As Worksheet
Dim i As Integer
i = 1
Set wsTarget = ActiveWorkbook.Worksheets("Sheet1")


For Each oElement In oHtml.getElementsByClassName("snapshot")
  wsTarget.Range("A" & i) = Split(oHtml.getElementsByClassName("snapshot").Item(0).FirstChild.FirstChild.innerHTML, "TD")(7)
  wsTarget.Range("A" & i) = Replace(wsTarget.Range("A" & i), ">", "")
  wsTarget.Range("A" & i) = Replace(wsTarget.Range("A" & i), "</", "")
  i = i + 1
Next


End Sub
次重要分析测试()
作为HTMLDocument的Dim oHtml
作为IHTMLElement的尺寸元素
设置oHtml=新HTMLDocument
使用CreateObject(“WINHTTP.WinHTTPRequest.5.1”)
.打开“获取”http://www.marketwatch.com/investing/stock/aapl/analystestimates”“错
.发送
oHtml.body.innerHTML=.responseText
以
将目标设置为工作表
作为整数的Dim i
i=1
设置wsTarget=ActiveWorkbook.Worksheets(“Sheet1”)
对于oHtml.getElementsByClassName(“快照”)中的每个oElement
wsTarget.Range(“A”&i)=拆分(oHtml.getElementsByClassName(“快照”).Item(0).FirstChild.FirstChild.innerHTML,“TD”)(7)
wsTarget.Range(“A”&i)=替换(wsTarget.Range(“A”&i)、“>”、“”)

wsTarget.Range(“A”&i)=Replace(wsTarget.Range(“A”&i)”,“这将满足您的需要

Sub Test() Dim IE As Object

Set IE = CreateObject("InternetExplorer.Application")
With IE
    .Visible = True
    .Navigate "http://www.marketwatch.com/investing/stock/aapl/analystestimates" ' should work for any URL
    Do Until .ReadyState = 4: DoEvents: Loop

        x = .document.body.innertext
        y = InStr(1, x, "Average Target Price:")
        Z = Mid(x, y, 6)

        Range("A1").Value = Trim(Z)

        .Quit
    End With
End Sub
使用组合将值作为其在表的第二列中的第一行表单元格的位置作为目标要容易得多。CSS选择器是
.snapshot.first.column2+td
,它使用
类选择器、
”、
子代组合符和
“+”
相邻同级组合符

Option Explicit
Public Sub ImportAnalystEst()
    Dim oHtml       As HTMLDocument
    Dim oElement    As IHTMLElement

    Set oHtml = New HTMLDocument

    With CreateObject("WINHTTP.WinHTTPRequest.5.1")
        .Open "GET", "http://www.marketwatch.com/investing/stock/aapl/analystestimates", False
        .send
        oHtml.body.innerHTML = .responseText
    End With
    Debug.Print oHtml.querySelector(".snapshot .first.column2 + td").innertext
End Sub

为什么不直接查看
innerText
并使用正则表达式获取所需的值呢?如果您可以依赖布局,并且不必搜索“平均目标价格”,那么
Split(oHtml.getElementsByClassName(“快照”).item(0).firstchild.firstchild.innerhtml,“TD”)(7)
将返回:
>146.52为什么每个……下一个
循环都有
?我实际上将循环一系列迭代。这是我流程的下一步。我现在正在创建并排除故障。我的最终产品实际上会在a列中有几百个股票符号,然后将分析师的估计放在因此GET函数以及For-Each函数必须是某种循环。您可能已经注意到“aapl”在上面的例子中。这是股票符号,将根据A列进行更改。您对更正或更有效的结构有什么建议吗?我会检查您是否可以通过一次调用从marketwatch获得多个报价,以获取您感兴趣的参数。我以Fidelity进行操作,但我只寻找cu最近的引用和时间。