2016-05-12 63 views
0

我是新來的vba,如此裸露在我身邊。我試圖颳去晨星內部所有權在這個網址: http://investors.morningstar.com/ownership/shareholders-overview.html?t=TWTR&region=usa&culture=en-US使用VBA晨星金融的網頁搜狗

這是我使用的代碼:

Sub test() 

    Dim appIE As Object 
    Set appIE = CreateObject("internetexplorer.application") 


    With appIE 
     .Navigate "http://investors.morningstar.com/ownership/shareholders-overview.html?t=TWTR&region=usa&culture=en-US" 
     .Visible = True 
    End With 

    While appIE.Busy 
     DoEvents 
    Wend 

    Set allRowOfData = appIE.Document.getElementById("currentInsiderVal") 
    Debug.Print allRowOfData 
    Dim myValue As String: myValue = allRowOfData.Cells(0).innerHTML 


    appIE.Quit 
    Set appIE = Nothing 
    Range("A30").Value = myValue 
    End Sub 

我得到的運行時間線誤差13 集allRowOfData = appIE.Document.getElementById(「currentInsiderVal」) 但我看不到任何不匹配。到底是怎麼回事?任何幫助將不勝感激。非常感謝,Aidan

回答

0

你可以只用XHR和正則表達式做到這一點,而不是笨重的IE:

Sub Test() 
    Dim sContent 
    With CreateObject("MSXML2.XMLHTTP") 
     .Open "GET", "http://investors.morningstar.com/ownership/shareholders-overview.html?t=TWTR&region=usa&culture=en-US", False 
     .Send 
     sContent = .ResponseText 
    End With 
    With CreateObject("VBScript.RegExp") 
     .Pattern = ",""currInsiderVal"":(.*?)," 
     Range("A30").Value = .Execute(sContent).Item(0).SubMatches(0) 
    End With 
End Sub 

下面是代碼是如何工作的說明:

首先MSXML2.XMLHTTP的ActiveX實例是創建。 GET請求以同步模式下的目標URL打開(執行中斷直到收到響應)。

Then VBScript.RegExp is created。默認.IgnoreCase.Global.MultiLine屬性是False。模式是,"currInsiderVal":(.*?),,其中(.*?)是一個捕獲組,.表示任何字符,.* - 零個或多個字符,.*? - 儘可能少的字符(惰性匹配)。模式中的其他字符可以被找到。 .Execute方法返回匹配的集合,因爲.GlobalFalse,所以只有一個匹配對象。該匹配對象具有一系列子匹配,因爲該模式包含唯一的捕獲組,所以只有一個子匹配。
上有正則表達式的一些有用的MSDN文章:
Microsoft Beefs Up VBScript with Regular Expressions
Introduction to Regular Expressions

這裏是我創建的代碼說明:

首先,我發現使用含網頁上的DOM目標值元素瀏覽器:

target value

相應節點是:

<td align="right" id="currrentInsiderVal">143.51</td> 

然後我做了XHR,發現在響應HTML這個節點上,但它並沒有包含值(你可以找到在網絡選項卡上的瀏覽器開發者工具響應刷新頁面後):

<td align="right" id="currrentInsiderVal"> 
</td> 

這種行爲是DHTML的典型特徵。動態HTML內容是在加載網頁之後通過腳本生成的,無論是在通過XHR從網絡檢索數據還是僅處理已加載的網頁數據之後。然後,我只是搜索的響應值143.51,位於JS函數中的片段,"currInsiderVal":143.51,

  fundsArr = {"fundTotalHistVal":132.61,"mutualFunds":[[1,89,"#a71620"],[2,145,"#a71620"],[3,152,"#a71620"],[4,198,"#a71620"],[5,155,"#a71620"],[6,146,"#a71620"],[7,146,"#a71620"],[8,132,"#a71620"]],"insiderHisMaxVal":3.535,"institutions":[[1,273,"#283862"],[2,318,"#283862"],[3,351,"#283862"],[4,369,"#283862"],[5,311,"#283862"],[6,298,"#283862"],[7,274,"#283862"],[8,263,"#283862"]],"currFundData":[2,2202,"#a6001d"],"currInstData":[1,4370,"#283864"],"instHistMaxVal":369,"insiders":[[5,0.042,"#ff6c21"],[6,0.057,"#ff6c21"],[7,0.057,"#ff6c21"],[8,3.535,"#ff6c21"],[5,0],[6,0],[7,0],[8,0]],"currMax":4370,"histLineQuars":[[1,"Q2"],[2,"Q3"],[3,"Q4"],[4,"Q1<br>2015"],[5,"Q2"],[6,"Q3"],[7,"Q4"],[8,"Q1<br>2016"]],"fundHisMaxVal":198,"currInsiderData":[3,143,"#ff6900"],"currFundVal":2202.85,"quarters":[[1,"Q2"],[2,""],[3,""],[4,"Q1<br>2015"],[5,""],[6,""],[7,""],[8,"Q1<br>2016"]],"insiderTotalHistVal":3.54,"currInstVal":4370.46,"currInsiderVal":143.51,"use10YearData":"false","instTotalHistVal":263.74,"maxValue":369}; 

所以正則表達式模式基礎上創建,它應該找到片段,"currInsiderVal":<some text>,其中<some text>是我們的目標值。

+0

你是一個絕對的傳奇人物,我花了好幾天的時間試圖做到這一點。我可以解釋一兩件事情,而不是無意識地使用它?如第二個..你已經使用currInsiderVal而不是currrentInsiderVal ..這是否意味着尋找具有這些字符的單詞,所以我將不得不確保我所尋找的是獨特的?並且該項目(0)是否查找第一個項目(本例中的項目實際上是什麼意思?)然後submatch(0)查找項目中的第一個元素??許多非常感謝您的幫助! –

+0

@ AidanO'Farrell看看我添加的描述。 – omegastripes

0

看看網站和你試圖檢索的元素有一個錯字;而不是currentInsiderVal嘗試使用currrentInsiderVal,您應該正確檢索數據。

可能值得考慮一些錯誤陷阱來捕獲這樣的東西你檢索的任何其他領域?

在您的評論後,我仔細看了一下。你的問題似乎是試圖捕獲單個單元格的ID,而不是沿着對象樹進行導航。我修改了代碼來檢索你所在表格的行,然後將myValue設置爲該行內的正確單元格。當我嘗試了它似乎工作。給這個鏡頭?

Sub test() 

Dim appIE As Object 
Set appIE = CreateObject("internetexplorer.application") 


With appIE 
    .Navigate "http://investors.morningstar.com/ownership/shareholders-overview.html?t=TWTR&region=usa&culture=en-US" 
    .Visible = True 
End With 

While appIE.Busy 
    DoEvents 
Wend 

Set allRowOfData = appIE.Document.getelementbyID("tableTest").getElementsByTagName("tbody")(0).getElementsByTagName("tr")(5) 
myValue = allRowOfData.Cells(2).innerHTML 

appIE.Quit 
Set appIE = Nothing 
Range("A30").Value = myValue 
End Sub 
+0

哦,謝謝!我希望你能再次幫助我(抱歉 - 我剛纔說vba是新手)。所以一旦我糾正了這個錯誤,我仍然得到了相同的運行時錯誤013 ..所以我刪除了'set',然後運行到我定義myValue的位置,在這一點我得到運行時錯誤424,說我需要使用'set' (注意,當我這樣做時,debug.print給出的值爲null)。那麼我再次使用set,當然我得到同樣的錯誤。我顯然不明白HTML結構,並試圖使用innerText而不是innerHTML,但我仍然遇到同樣的問題...您認爲我錯過了什麼?謝謝 –

+0

乾杯戴夫,我認爲這是有效的 - 我的意思是所有它似乎做的是增加單元格的高度,似乎並不包含任何東西,因爲單元格或文本行中沒有單詞/文本,儘管它看起來有些可能在那裏,但它的無形 - 像聽起來那樣愚蠢,我可以突出顯示某些東西,並且試圖改變顏色(只是將它設置爲白色),但這並不起作用。明天我會再看看它。感謝您的幫助 –

+0

聽起來像你可能會拿起一個空單元格,而不是有價值的單元格。我在Excel中本地運行了上面的代碼,它很高興地拉回了141.9(或其它)的值...打開網頁,然後用IE中的開發工具(F12)檢查想要檢索的元素。在DOM Explorer上,元素的層次結構列在底部。從父表對象開始工作,沿着路徑向下到你想要的元素... – Dave