【问题标题】:Try to get some data from a web site尝试从网站获取一些数据
【发布时间】:2016-02-10 15:42:27
【问题描述】:

我想从金融网站获取不同的价格并将它们存储在 Excel 文件中。 我没有很好的知识,我想知道我为从网站获取数据所做的代码是最好的还是可以做得更好。 网站 HTML 代码就是这个。我想在 'Prezzo di chiusura' 之后得到最后一个 td,里面有 103,74。

我有这些问题:

  • 我使用了get elementsbytagname("td")(39),我刚刚统计了页面中的td数,有没有更好的方法来解决这个td?
  • 我注意到有时我有以前的价格,而不是我在网页中看到的价格,我使用我的代码访问的区域数据与我在网页中看到的不同,直到它没有更新我会看到只有以前的数据?

HTML代码是:

<div class="instruments_company_summary">
  <table class="table-noborders">
    <tr>
      <td class="table_label"> </td>
      <td>
        <div class="floatdx" style="padding-bottom:10px">
          <div class="floatsx">
            <div class="standard-button">
              <a href="/it/strumenti/grafico/IT0004785355">Grafico</a>            </div>
          </div>
                      <div class="floatsx">
              <div class="standard-button">
                <a href="http://www.eurotlx.com/product-details/IT0004785355.pdf" target="_blank">Scheda</a>              </div>
            </div>
                              <div class="floatsx">
            <div class="standard-button">
              <a href="/it/strumenti/dettaglio/csv/IT0004785355">Scarica book</a>            </div>
          </div>
        </div>
      </td>
    </tr>
    <tr>
      <td class="table_label">Isin</td>
      <td>
        <div class="floatsx" style="padding-top:4px;">IT0004785355</div>
      </td>
    </tr>
    <tr>
      <td class="table_label">Descrizione</td>
      <td>Bpvi 7% 29dc16</td>
    </tr>
    <tr>
      <td class="table_label">Prezzi aggiornati al</td>
      <td>09-11-2015 21:28:48</td>
    </tr>
  </table>

  <table>
    <tr>
      <th colspan="2">Book di negoziazione</th>
    </tr>
    <tr>
      <td class="table_label">Var</td>
      <td>0,05%</td>
    </tr>
    <tr>
      <td class="table_label" style="border:0">Book a 5 livelli</td>
      <td style="border:0; padding: 10px 0 5px">
        <table>
          <thead>
          <tr>
            <th>Q.tà Acquisto</th>
            <th>Prezzo Acquisto</th>
            <th>Prezzo Vendita</th>
            <th>Q.tà Vendita</th>
          </tr>
          </thead>
          <tbody>
                        <tr>
              <td>-</td>
              <td>-</td>
              <td>-</td>
              <td>-</td>
            </tr>
                        <tr>
              <td>-</td>
              <td>-</td>
              <td>-</td>
              <td>-</td>
            </tr>
                        <tr>
              <td>-</td>
              <td>-</td>
              <td>-</td>
              <td>-</td>
            </tr>
                        <tr>
              <td>-</td>
              <td>-</td>
              <td>-</td>
              <td>-</td>
            </tr>
                        <tr>
              <td>-</td>
              <td>-</td>
              <td>-</td>
              <td>-</td>
            </tr>
                      </tbody>
        </table>
      </td>
    </tr>
  </table>

  <table>
    <tr>
      <th colspan="2">Dati ultimo contratto</th>
    </tr>
    <tr>
      <td class="table_label">Prezzo</td>
      <td>103,93</td>
    </tr>
    <tr>
      <td class="table_label">Quantità</td>
      <td>5.000</td>
    </tr>
    <tr>
      <td class="table_label">Data e ora</td>
      <td>09-11-2015 16:59:33</td>
    </tr>
  </table>

  <table>
    <tr>
      <th colspan="2">Dati giornalieri</th>
    </tr>
    <tr>
      <td class="table_label">Prezzo di chiusura</td>
      <td>103,74</td>
    </tr>

Excel VBA 代码是这个:

Dim W As Worksheet: Set W = ActiveSheet
Dim Objie As Object
Dim xObj

Set Objie = CreateObject("InternetExplorer.Application")
Objie.Visible = False

Objie.Navigate "http://www.eurotlx.com/it/strumenti/dettaglio/IT0004785355"

While (Objie.Busy Or Objie.ReadyState <> 4)
    DoEvents
Wend

Set xObj = Objie.Document.getElementsByTagName("td")(39)

W.Range("I3" ) = xObj.innerText

Set xObj = Nothing
Objie.Quit
Set Objie = Nothing

【问题讨论】:

    标签: html excel vba


    【解决方案1】:

    这样会更好(避免您更改以前表格中的行数)

    Dim tbl, xObj
    
    Set tbl = Objie.Document.getElementsByTagName("table")(3) '4th table on page
    Set xObj = tbl.getElementsByTagName("td")(2)              'second td in that table
    

    【讨论】:

    • Tx 最后一个是getelements("td")(1)而不是(2)
    • 可能会问你另一个问题,你知道为什么我现在没有我在网站上看到的数据而是前一天的数据吗?也许是因为我访问了它用于网页的另一个内存区域,现在我有 103,88 而在网站上是今天的价格 103,74
    【解决方案2】:

    您还可以搜索所需的数据(“PREZZO DI CHUSURA”)并使用nextElementSibling 属性获取赋予它的值。这样,您始终可以确保获得的值与 eurotlx.com 提供的表结构无关。

    Sub Scrape()
    
        Dim ie As Object
    
        'Get rid of cached sites
        Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255"
    
        Set ie = CreateObject("InternetExplorer.Application")
        ie.Visible = False
        ie.navigate "http://www.eurotlx.com/it/strumenti/dettaglio/IT0004785355"
    
        While (ie.Busy Or ie.ReadyState <> 4)
        DoEvents
        Wend
    
        Set tds = ie.document.getElementsByClassName("table_label")
    
        For Each TDelement In ie.document.getElementsByClassName("table_label")
          If InStr(TDelement.innerText, "Prezzo di chiusura") Then
             Range("I3") = TDelement.nextElementSibling.innerText
             Exit For
          End If
        Next
    
    End Sub
    

    当然,这种方法的弱点是,如果站点管理员更改了“prezzo di chiusura”的innerText,Excel将无法找到它的值。

    【讨论】:

    • tx 获取有用的答案。但是有没有办法访问我在网页中看到的更新数据,或者无法访问网页使用的内存?
    • 一旦 DOM 完全加载,您使用的任何宏都会为您获取元素的值。因此,如果您想跟踪每天的股票价格变化,您必须在 Windows 任务计划程序中创建一个任务,当然,调整宏以将值存储在正确的位置。
    • 可能是我现在想要的,它更简单,我只想要一个包含股票和债券的 excel 文件和一个按钮,当我按下按钮时,我想在我的表中更新当天的结算价格.现在我可以在我的 excel 表中加载价格,但我注意到我并不总是让元素与网页保持同步。当然,getelement 访问的区域与网页不同
    • 能否请您发布一个 URL,其中 Excel 中的值与网站中显示的值不同?
    • 例如,现在在该特定债券的网页中,结算价格 (Prezzo di chiusura) 为 103,74,但 getelement 加载之前的结算价格为 103,88。这是一个静态数字,不会连续变化
    【解决方案3】:

    CSS 选择器:

    您可以使用 CSS 选择器:table:last-child .table_label ~ td

    带有td标签的元素在最后一个带有类名.table_labeltable标签之后。


    CSS 查询:


    VBA:

    您使用documentquerySelector 方法应用CSS 选择器。

    Debug.Print Objie.Document.querySelector("table:last-child .table_label ~ td").innerText
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-03
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多