Live-Forum - Die aktuellen Beiträge
Datum
Titel
29.03.2024 13:14:12
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1444to1448
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

IE DOM - HTML-Dokument über Funktion holen

IE DOM - HTML-Dokument über Funktion holen
24.08.2015 23:56:32
Zwenn
Hallo zusammen,
im Moment habe ich mal wieder mit dem Document Object Model über Excel VBA zu tun. Es geht darum die Angebote eines Online-Shops auszulesen. Dabei wird es zu mehreren 1.000 URL-Aufrufen kommen. Nach ersten Tests habe ich festgestellt, dass die "herkömmliche" Weise den Browser sehr oft im Hauptprogramm zu öffnen und zu schließen zu instabielem Verhalten des Internet Explorer führt.
Deshalb möchte ich das HTML-Dokument gerne über eine eigene Funktion holen. Nach ersten Tests funktioniert das auch bereits wesentlich besser (Speicher wird mit Pausen zwischendurch wieder ordentlich frei gegeben, was vorher nicht klappte). Allerdings muss ich dazu den Browser in der Funktion öffnen und in der gleichen Funktion die Operationen auf dem DOM durchführen, die ich brauche.
Wesentlich flexiebler wäre das Ganze für mich aber, wenn ich mir nur das HTML-Dokument über eine Funktion hole und anschließend mit dem Objekt aus dem Hauptprogramm heraus agieren könnte. Das scheitert aber daran, dass ich den Laufzeitfehler 70 bekomme 'Zugriff verweigert'.
Ich habe verschiedene Tests gemacht. Ich weiß, dass die HTML-Struktur im geholten Objekt richtig vorhanden ist. Wenn ich dieses Objekt aber in einer weitere Funktion gebe, um damit etwas anzustellen, kommt besagter Laufzeitfehler. Auch der Versuch das Ganze ByRef zu machen scheitert.
Auch der Versuch die Microsoft HTML Object Libary (mshtml.tbl) und Internet Controls über Extras -> Verweise... einzubinden und die Objekte als MSHTML.HTMLDocument zu verwalten führte zum gleichen Fehler.
Hat jemand von Euch eine Idee? Ich bin bereits soweit auf "schönen" Code zu verzichten und es quick & dirty zu programmieren. Aber natürlich wäre mir die universelle Programmierung über wieder verwendbare Funktionen wesentlich lieber.
Hier ist ein Beispielcode, den ich auf eBay Kleinanzeigen angepasst habe. Es geht nicht um die Plattform und auch nicht darum, dass die Anzahl Suchtreffer im Beispiel als String geholt wird obwohl es eine Zahl ist. Es geht nur darum, wie ich es hinbekomme ein HTML-Dokument als Objekt über eine eigene Funktion holen kann, mit dem ich nach der Rückgabe an das aufrufende Makro über die Möglichkeiten des DOM anstellen kann, was ich will.
Sub DOM_Object_Test()
Dim URL As String
Dim InhaltHTML As Object
'Erste Suchseite im Browser öffnen und Anzahl Such-Treffer auslesen
URL = "http://www.ebay-kleinanzeigen.de/s-bluray/k0"
Set InhaltHTML = HoleHTML(URL)
MsgBox HitZahlHolen(InhaltHTML)
End Sub
Function HoleHTML(adresse As String) As Object
Dim Browser As Object
Dim InhaltHTML As Object
Set Browser = CreateObject("internetexplorer.application")
Browser.Visible = False
Browser.Navigate adresse
Do Until Browser.ReadyState = 4: DoEvents: Loop
Set InhaltHTML = Browser.document.all.Item
Browser.Quit
Set Browser = Nothing
Set HoleHTML = InhaltHTML
End Function
Function HitZahlHolen(HTML As Object) As String
Dim KnotenAst As Object
Dim SplitDummy As Variant
Dim AnzahlHits As String
Set KnotenAst = HTML.getElementsByClassName("breadcrump")(0)
If Not KnotenAst Is Nothing Then
'Open ThisWorkbook.Path & "\HTML-Part.txt" For Output As #1
'Print #1, KnotenAst.outerHTML
SplitDummy = Split(KnotenAst.FirstChild.NextSibling.NextSibling.NextSibling.FirstChild. _
FirstChild.NodeValue)
AnzahlHits = AnzahlHits & SplitDummy(4)
Else
AnzahlHits = "0"
End If
Set KnotenAst = Nothing
HitZahlHolen = AnzahlHits
End Function
Viele Grüße,
Zwenn

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: IE DOM - HTML-Dokument über Funktion holen
28.08.2015 10:23:47
Jürgen
Hallo Zwenn,
Du weist der Objektvariablen InhaltHTML ein Kind-Objekt des Browser-Objekts zu. Wenn Du das Browser-Objekt beendest (.quit), zerstörst Du damit auch alle davon abhängigen Objekte. Daher funktioniert das Auslagern der Objekterstellung in die Funktion HoleHTML so nicht - nimm den Code lieber in die Hauptprozedur.
Gruß, Jürgen
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige