2017-09-14 1 views
0

Ich versuche, Fondsgrößen mit Morningstar-Website zu aktualisieren. Mein vorheriger Versuch mit IE-Automatisierung hat nicht funktioniert, also wechselte ich zu XML httpRequest (funktioniert auch wesentlich schneller). Jetzt habe ich Schwierigkeiten, die richtigen Zeilen aus dem Dokument, das ich von der Website bekomme, auszudrucken. Ich möchte, dass der Code mir das 3. "td" -Tag innerhalb eines "tr" -Tags gibt, das 1. "td" -Tag heißt "Fund Size (Mil)". Der Code durchläuft also alle Überschriften der "td" -Tags und springt in Aktion, wenn er das "{line heading}" = "Fund Size (Mil)" findet. Jetzt ist das das Problem. Ich weiß nicht, wie ich mich auf diese Überschriften beziehen soll.HTML-Analyse in VBA

Ich habe versucht, jedes "td" -Tag als Variable zu setzen (es gibt 3 "td" -Tags in einem "tr" -Tag, also hatte ich Variablen row1, row2, row3 für jedes "td-tag"), aber wenn ich versuche, dies jetzt zu tun, erhalte ich ein Laufzeitfehler 438: Objekt nicht diese Eigenschaft oder Methode in Linie

Debug.Print TDElements.getElementsByTagName("tr")(0).Cells(0).innerHTML 

Zusätzlich unterstützt, wenn ich Debug.Print TDElement.innerHTML, ich sehe nicht, die "td" -Tags, die ich brauche. Wenn ich stattdessen am Ende .innerText setze, sehe ich alle "td" -Tags.

Nun sind die Fragen: 1) Wie kann ich direkt auf die Überschriften verweisen? (Siehe die kommentierten Codezeilen innerhalb For Each Schleife unten) 2) Was kann der Grund sein, dass ich nicht alle Td-Tags mit .innerHTML sehe, aber ich sehe sie mit .innerText?

URL http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW Excel 2010, IE Version 11.

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

Dim myurl As String 
Dim TDElement As Object 
Dim TDElements As IHTMLElementCollection 
Dim IE As MSXML2.XMLHTTP60 

Dim HTMLDoc As MSHTML.HTMLDocument 
Dim HTMLBody As MSHTML.HTMLBody 

Set IE = New MSXML2.XMLHTTP60 
Set HTMLDoc = New MSHTML.HTMLDocument 
Set HTMLBody = HTMLDoc.body 


myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
IE.Open "GET", myurl, False 
IE.send 

HTMLBody.innerHTML = IE.responseText 

Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     Debug.Print TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
'  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
'   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
    Next 


End Sub 

h2so4 ist die obige Problem behoben Antwort. Unten ist eine Erweiterung der ersten Frage.

Jetzt wird dem TDElement ein paar Textzeilen zugewiesen (ich habe den Wert von h2so4 auf 10 umgestellt, so dass der Code die nächsten 3 Zeilen anzeigt, wenn fondsize_string gefunden wird). Wie kann ich das weiter analysieren? Aktuelle Zeile Worksheets("helper").Cells(x, 6).Value = Split(TDElement.innerText, " ")(1) gibt den Wert zurück, den ich brauche (769,28), aber für die Zukunft wäre es hilfreich, wenn ich wirklich verstehen würde, was genau hier passiert.

Also, nur für Übung, wie würde ich alle 3 Zeilen in ihren eigenen Zellen gedruckt bekommen? Die Ausgabe wäre also: Fondsgröße (Mil), 31/08/2017, 769,28 in Zellen (x, 6), (x, 7), (x, 8). Wenn ich die Funktionen "Split" oder "Left" zu TDElement ausprobiere, zielen die Funktionen nur auf die letzte Zeile, nicht auf die anderen Zeilen darüber. Wenn ich jedoch die Debug.Print TDElement.innerText/.innerHTML sehe, sehe ich auch die anderen Zeilen. Wie kann ich also auf die Zeilen über der letzten Zeile "zugreifen"?

Ausgabe von Debug.Print TDElement.innerText:

Fondsvolumen (Mil)

31/08/2017

EUR 769,28

Antwort

0

der folgende Code führt Sie zu den "Fondsgröße" erhalten Linie

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

    Dim myurl As String 
    Dim TDElement As Object 
    Dim TDElements As IHTMLElementCollection 
    Dim IE As MSXML2.XMLHTTP60 
    Dim Flag As Boolean 
    Dim HTMLDoc As MSHTML.HTMLDocument 
    Dim HTMLBody As MSHTML.HTMLBody 
    Dim k As Long 
    Set IE = New MSXML2.XMLHTTP60 
    Set HTMLDoc = New MSHTML.HTMLDocument 
    Set HTMLBody = HTMLDoc.body 


    myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
    IE.Open "GET", myurl, False 
    IE.send 

    HTMLDoc.body.innerHTML = IE.responseText 
    Flag = False 
    k = 0 
    Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     If InStr(TDElement.innerText, "Fund Size") <> 0 Or Flag Then 
      'if fundsize string is found, display the next 10 lines 
      Debug.Print ":" & TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
      '  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
      '   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
      k = k + 1 
      If k < 10 Then Flag = True Else Flag = False 
     End If 
    Next 


End Sub 
+0

Vielen Dank! Das funktioniert.Ich habe Ihren Code geändert, indem ich eine neue Integer-Variable n deklariert habe und sie auf 3 statt 10 setze (zielt nur auf die Zeilen, die ich brauche). Ich möchte jedoch wissen, warum ich nur die letzte Zeile parsen kann, die der Code zurückgibt. Bitte beachten Sie die ** Erweiterung der ersten Frage ** oben. – Samppa

0

um Ihre Erweiterung zu beantworten, die Möglichkeit, die a zu teilen nswer hängt davon ab, wie die Seite gestaltet wurde. Hier ist eine mögliche Lösung, um Ihre Daten in 3 verschiedenen Zellen zu erhalten.

Sub XMLhttpRequestTest2() 

'Microsoft XML, v 6.0 
'Microsoft HTML object library, used in parsing HTML 

    Dim myurl As String 
    Dim TDElement As Object 
    Dim TDElements As IHTMLElementCollection 
    Dim IE As MSXML2.XMLHTTP60 
    Dim Flag As Boolean 
    Dim HTMLDoc As MSHTML.HTMLDocument 
    Dim HTMLBody As MSHTML.HTMLBody 
    Dim k As Long, text 
    Set IE = New MSXML2.XMLHTTP60 
    Set HTMLDoc = New MSHTML.HTMLDocument 
    Set HTMLBody = HTMLDoc.body 


    myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW" 
    IE.Open "GET", myurl, False 
    IE.send 

    HTMLDoc.body.innerHTML = IE.responseText 
    Flag = False 
    k = 0 
    Set TDElements = HTMLDoc.getElementsByTagName("td") 
    For Each TDElement In TDElements 
     If InStr(TDElement.innerText, "Fund Size") <> 0 Or Flag Then 
      'if fundsize string is found, display the next 10 lines 
      text = Split(TDElement.innerText, vbLf) 
      If text(0) <> "" Then 
       Worksheets("Sheet3").Cells(3, k + 2).Resize(, UBound(text) + 1) = text '.innerText/.innerHTML. Can't see the fund size with .innerHTML?? 
       '  If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document? 
       '   Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text? 
      End If 
      k = k + 1 
      If k < 3 Then Flag = True Else Flag = False 
     End If 
    Next 
End Sub