2016-12-22 5 views
1

Ich versuche, Monat-zu-Datum und Jahr-zu-Datum Rückgabewerte von der Website http://us.spindices.com/indices/equity/sp-oil-gas-exploration-production-select-industry-index in eine Excel-Tabelle mit VBA zu erhalten. Das Problem ist, dass es im Code der Seite kein "id =" gibt, was meiner Meinung nach diesen Prozess viel einfacher machen würde. Es gibt auch die Frage, welcher Zeitraum (Jahr-zu-Datum oder Monat-zu-Datum) sichtbar ist, aber ich würde mich freuen, gerade die MTD-Werte für jetzt zu kratzen.scrape html ohne ID in VBA

Hier ist mein Code:

Sub Get_Change() 

'attempting to scrape Barclay's website 

Dim appIE As Object 
Dim MyVar As String 


Set appIE = CreateObject("internetexplorer.application") 

With appIE 
    .Navigate "http://us.spindices.com/indices/equity/sp-oil-gas-exploration-production-select-industry-index" 
    .Visible = True 
End With 

Do While appIE.Busy 
    DoEvents 
    Range("A1").Value = "Working..." 
Loop 
Set TDelements = appIE.document.getElementsbyClassName("performance-chart-table") 

For Each TDelement In TDelements 
    If TDelement.class = "change" Then 
     MyVar = TDelement.class.innerText("Value") 

    End If 
Next 
Range("A1").Value = MyVar 
appIE.Quit 
Set appIE = Nothing 


End Sub 

Wenn ich einen Weg können die ‚MyVar‘ Variable auf den aktuellen MTD oder YTD Wert zu setzen, ich getan werde, aber ich habe eine harte, die Zeit, da es keinen eindeutigen Bezeichner für einen dieser Werte gibt. Irgendwelche Ideen?

Antwort

0

Ich habe kürzlich einige CSS-Schulungsvideos angeschaut und ich kann Ihnen sagen, dass die CSS-Selektor-Syntax sehr leistungsfähig ist und ich würde sie empfehlen. Dies ist die gleiche Syntax, mit der JavaScript-/Webentwickler Elemente auswählen, wenn sie JQuery verwenden.

Ich glaube, Sie sollten versuchen,

document.queryselectorall

oder in Ihrem Fall verwenden, da Sie in das Dokument gebohrt haben die „Performance-Chart-Tabelle“ queryselectorall aus diesen Variablen rufen zu bekommen, TDelements.

Dokumentation bei http://www.w3schools.com/jsref/met_document_queryselectorall.asp

und als Parameter liefert einen CSS-Selektor-String die Syntax von denen bei http://www.w3schools.com/cssref/css_selectors.asp

finden Und ich habe es weg und fertig für Sie ....

Sub Get_Change() 
    '* Tools-References Microsoft HTML Object Library 

    'attempting to scrape Barclay's website 

    Dim appIE As Object 
    Dim MyVar As String 


    Set appIE = CreateObject("internetexplorer.application") 

    With appIE 
     .Navigate "http://us.spindices.com/indices/equity/sp-oil-gas-exploration-production-select-industry-index" 
     .Visible = True 
    End With 

    Do While appIE.Busy 
     DoEvents 
     Range("A1").Value = "Working..." 
    Loop 
    Dim htmlDoc As MSHTML.HTMLDocument 
    Set htmlDoc = appIE.document 

    Dim TDelements2 As MSHTML.IHTMLElementCollection 
    Set TDelements2 = htmlDoc.getElementsByClassName("performance-chart-table") 
    While TDelements2.Length < 1 

     DoEvents 
     Application.Wait (Now() + TimeSerial(0, 0, 3)) 
     Set TDelements2 = htmlDoc.getElementsByClassName("performance-chart-table") 

    Wend   

    Dim oHTMLTablePerformanceChartTable As MSHTML.HTMLTable 
    Set oHTMLTablePerformanceChartTable = TDelements2.Item(0) 


    Dim objChangeCollection As MSHTML.IHTMLDOMChildrenCollection 
    Set objChangeCollection = oHTMLTablePerformanceChartTable.querySelectorAll(".change") 

    'Debug.Assert objChangeCollection.Length = 2 

    Dim objChange2 As Object 
    Set objChange2 = objChangeCollection.Item(1) 


    MyVar = objChange2.innerText 




    'Set TDelements = appIE.document.getElementsByClassName("performance-chart-table") 
    ' 
    'For Each TDelement In TDelements 
    ' TDelements.querySelectorAll (".change") 
    ' If TDelement.class = "change" Then 
    '  MyVar = TDelement.class.innerText("Value") 
    ' 
    ' End If 
    'Next 
    Range("A1").Value = MyVar 
    appIE.Quit 
    Set appIE = Nothing 


End Sub 
+0

Wow, das ist großartig, danke! Ich bekomme einen Laufzeitfehler, wenn ich den Code ausführe. Gibt es ein Objekt, das ich in der Referenzbibliothek auswählen muss, damit es ordnungsgemäß ausgeführt wird? – DangeRuss

+0

Zeile 34 - die, die endet .querySelectorAll (". Change"). Ich habe gegooglet, und ich weiß nicht sicher, wie man es repariert ... – DangeRuss

+0

IE11 Fehler 91 ist die "Objektvariable oder mit Blockvariable nicht gesetzt" übrigens – DangeRuss