Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1592to1596
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

GetElementByClass bzw. ByTagName

GetElementByClass bzw. ByTagName
25.11.2017 22:24:32
Oliver
Hey Leute,
ich habe folgendes Problem: Ich möchte von einer Seite für einen Artikel die Model Nummer automatisch herausziehen und in meine Excel Tabelle kopieren. Nur ist diese Seite ein bisschen komisch aufgebaut, würde ich behaupten.
Die Seite ist so konstruiert:
https://img3.picload.org/image/drcdgoal/unbenannt.png

Ich würde gerne nach dem Titel: Model Number suchen und einfach das nächste
Freu mich mega auf eure Antworten.
Mit freundlichen Grüßen
Oliver

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: GetElementByClass bzw. ByTagName
26.11.2017 06:14:19
Hajo_Zi
Hallo Oliver,
Excel kann wenig mit einem Bild anfangen.

Ich gebe keinen Dank für eine Rückmeldung, da ich durch solche Beiträge nicht meine Beitragszahl erhöhen muss.
Also ich schreibe keine Beiträge mit dem Betreff "Gerne u. Danke für die Rückmeldung. o.w.T."
Rückmeldung ist ja in der Heutigen Zeit nicht üblich und die wenigen die eine Rückmeldung geben,
mögen mir das verzeihen, das kein Danke für eine Rückmeldung kommt.
Beiträge von Werner, Luc, robert und folgende lese ich nicht.
AW: GetElementByClass bzw. ByTagName
26.11.2017 10:33:04
Zwenn
Hallo Oliver,
so funktioniert das nicht. Die Seite ist ganz normal aufgebaut, würde ich mal behaupten ;-) Allerdings kann man Dir nur helfen, wenn man den ganzen Quelltext der Seite hat. Nicht als Bild. Setz doch einfach mal den Link hier rein.
Ich kann Dir anhand des Code-Ausschnitts auf dem Bild aber schon sagen, dass Dir das "Suchen" nach "Model Number" gar nicht weiterhilft. Du kannst wahrscheinlich direkt den Wert abgreifen, den Du haben willst. Sollte es die einzige Medell Nummer auf der angezeigten Seite sein, geht das so:

Sub MedelNummerHolen()
Dim browser As Object   'Aufnehmen der verwendeten Instanz des Browsers (Internet Explorer)
Dim knotenAst As Object 'Aufnehmen einer HTML Struktur aus dem Browser Dokument
Dim url As String       'Aufnehmen der auszulesenden Adresse
url = "Hier die Adresse der Internetseite, von der die Modell Nummer geholt werden soll"
'Aufrufen der Seite im Internet Explorer
Set browser = CreateObject("internetexplorer.application")
browser.Visible = False
browser.navigate url
Do Until browser.readyState = 4: DoEvents: Loop
'Versuchen das HTML Element in knotenAst zu übernehmen,
'welches die Modell Nummer enthält
Set knotenAst = browser.document.getElementsByClassName("ellipsis")(0)
'Wenn das funktioniert hat ...
If Not knotenAst Is Nothing Then
'Modell Nummer in einer Message Box ausgeben
MsgBox knotenAst.innerText
End If
'Aufräumen
browser.Quit
Set browser = Nothing
Set knotenAst = Nothing
End Sub
Die getElements Befehle erzeugen ein Null-basiertes Array aus allen HTML Elementen, die die Bedingung erfüllen. Sollte es also mehrere HTML Tags geben, die die CSS-Klasse ellipsis zugewiesen bekommen haben und das mit der Modell Nummer ist nicht das erste, bekommst Du einen falschen Wert zurück geliefert. Deshalb braucht man unbedingt den ganzen Quellcode eine Seite, um diese Abfragen richtig aufbauen zu können.
Viele Grüße,
Zwenn
Anzeige
AW: GetElementByClass bzw. ByTagName
26.11.2017 12:12:36
Oliver
Hey erstmal danke für eurer beide Mühe! hab der hat nichts ausgespuckt. Hier der Link von der Webseite hoffe du bekommst damit die Model Nummer raus!
https://www.alibaba.com/product-detail/RA-60L-folding-box-trolley-on_60728416039.html?spm=a2700.7724856.main07.1.62c4a114jYRFMX&s=p

Liebe Grüße
Oliver
AW: GetElementByClass bzw. ByTagName
26.11.2017 19:25:13
Zwenn
Hallo Oliver,
sofern Du Deinen geposteten Link in mein kleines Beispiel eigefügt hast, hättest Du eine Message Box mit der Ausgabe "Zhejiang, China (Mainland)" erhalten müssen. Ich habe es ausprobiert ;-)
Wie auch immer. Um an die Modell Nummer zu kommen, nutze einfach folgenden Code. Er ist so angelegt, dass es egal ist, an welcher Stelle in der Tabelle die Modell Nummer auftaucht. Es ist eher wenig Code und mehr Kommentare. Deshalb spare ich mir hier weitere Erklärungen:
(Den Zeilenumbruch in der URL musst Du entfernen. Der ist Forenbedingt eingefügt worden)

Sub ModellNummerHolen()
Dim browser As Object   'Aufnehmen der verwendeten Instanz des Browsers (Internet Explorer)
Dim knotenAst As Object 'Aufnehmen einer HTML Struktur aus dem Browser Dokument
Dim knoten As Object    'Aufnehmen einer HTML Unterstruktur aus knotenAst
Dim url As String       'Aufnehmen der auszulesenden Adresse
url = "https://www.alibaba.com/product-detail/RA-60L-folding-box-trolley-on_60728416039. _
html?spm=a2700.7724856.main07.1.62c4a114jYRFMX&s=p"
'Aufrufen der Seite im Internet Explorer
Set browser = CreateObject("internetexplorer.application")
browser.Visible = False
browser.navigate url
Do Until browser.readyState = 4: DoEvents: Loop
'Die HTML Elemente in knotenAst übernehmen, innerhalb
'derer sich der gesuchte Wert befindet
Set knotenAst = browser.document.getElementsByClassName("do-entry-item")
'Wenn das funktioniert hat ...
If Not knotenAst Is Nothing Then
'Checken, ob es sich um die Modell Nummer handelt.
'(Es gibt mehrere HTML-Abschnitte, die als Klasse "do-entry-item"
'zugewiesen bekommen haben. Es ist sogar so, dass innerhalb einer
'"do-entry-item" Klasse eine weitere "do-entry-item" Klasse enthalten ist.
'In dem Array ist unter der gegebenen UML der folgende Abschnitt, der erste:
'[dl class="do-entry-item"]
'[dt class="do-entry-item"]
'[span class="attr-name J-attr-name" title="Place of Origin"]Place of Origin:
[/span]
'[/dt]
'[dd class="do-entry-item-val"]
'[div class="ellipsis" title="Zhejiang, China (Mainland)"]Zhejiang, China
'(Mainland)[/div]
'[/dd]
'[/dl]
'An dieser Stelle ist wichtig zu verstehen, dass die Abfrage über einen getElemets
'Befehl wirklich HTML-Strukturen in einem Array abspeichert. Es ist nicht ein
'HTML-Befehl, sondern es beinhaltet auch alles, was innerhalb dieses Befehls liegt,
'bis er abgeschlossen wird.
'Im vorliegenden Fall werden alle Elemente des Arrays durchlaufen, bis ein Element
'gefunden wird, dass im eigentlichen Textteil "Model Number:" enthält
For Each knoten In knotenAst
'nach "Model Number" im Text des Quelltextes suchen, der ausgegeben wird
If InStr(1, knoten.innertext, "Model Number") Then
'Sobald "Model Number" gefunden wurde, muss der
'gesuchte Wert in dem HTML-Tag abgelegt sein, der
'mit der CSS-Klasse "ellipsis" formatiert wurde, weil
'es innerhalb der aktuell betrachteten HTML-Struktur
'nur ein HTML-Tag gibt, der so formatiert ist
'[dl class="do-entry-item"]
'[dt class="do-entry-item"]
'[span class="attr-name J-attr-name" title="Model Number"]
'Model Number: [/span]
'[/dt]
'[dd class="do-entry-item-val"]
'[div class="ellipsis" title="RA-60L"]RA-60L[/div]
'[/dd]
'[/dl]
'Deshalb wird direkt der erste Index des erzteugten Arrays angesprochen (0)
Set knoten = knoten.getElementsByClassName("ellipsis")(0)
If Not knoten Is Nothing Then
'Modell Nummer in einer Message Box ausgeben
MsgBox knoten.innertext
End If
End If
Next knoten
End If
'Aufräumen
browser.Quit
Set browser = Nothing
Set knotenAst = Nothing
End Sub

Du solltest in der Lage sein, das Ganze auch in eine Schleife zu verpacken, um mehrere Links nacheinander abzuklappern.
Viele Grüße,
Zwenn
Anzeige
AW: GetElementByClass bzw. ByTagName
27.11.2017 11:49:51
Oliver
WOW! Vielen lieben Dank für deine Hilfe und diese ausführliche Erklärung! Funktioniert super! :)
AW: GetElementByClass bzw. ByTagName
27.11.2017 14:59:56
Oliver
Was ich nur jetzt nicht verstehe, warum funktioniert dieser Script:
Sub ModellNummerHolen()
Dim browser As Object   'Aufnehmen der verwendeten Instanz des Browsers (Internet Explorer)
Dim knotenAst As Object 'Aufnehmen einer HTML Struktur aus dem Browser Dokument
Dim knoten As Object    'Aufnehmen einer HTML Unterstruktur aus knotenAst
Dim knotenAst2 As Object 'Aufnehmen einer HTML Struktur aus dem Browser Dokument
Dim knoten2 As Object    'Aufnehmen einer HTML Unterstruktur aus knotenAst
Dim url As String       'Aufnehmen der auszulesenden Adresse
url = "https://newjiashi.en.alibaba.com/product/60695335615-805629603/ _
New_Style_9_Cavity_Flower_Debossing_Design_Silicon_Cake_Decorating_Tools_Set.html?spm=a2700.8304367.prewdfa4cf.70.53d457b9O6bZF3"
Set browser = CreateObject("internetexplorer.application")
browser.Visible = False
browser.navigate url
Do Until browser.readyState = 4: DoEvents: Loop
Set knotenAst = browser.document.getElementsByClassName("do-entry-item")
If Not knotenAst Is Nothing Then
For Each knoten In knotenAst
If InStr(1, knoten.innerText, "Model Number") Then
Set knoten = knoten.getElementsByClassName("ellipsis")(0)
If Not knoten Is Nothing Then
Debug.Print knoten.innerText
End If
End If
Next knoten
End If
Set knotenAst2 = browser.document.getElementsByClassName("attr-name")
If Not knotenAst2 Is Nothing Then
For Each knoten2 In knotenAst2
If InStr(1, knoten2.innerText, "Model Number") Then
Set knoten = knoten2.getElementsByClassName("attr-value")(0)
If Not knoten2 Is Nothing Then
Debug.Print knoten2.innerText
End If
End If
Next knoten2
End If
'Aufräumen
browser.Quit
Set browser = Nothing
Set knotenAst = Nothing
End Sub
Auf dieser Seite nicht? Mir wird nur: "Model Number:" ausgepuckt und nicht die Modelnummer an sich.
Anzeige
AW: GetElementByClass bzw. ByTagName
28.11.2017 14:58:41
Zwenn
Hallo Oliver,
Du kommst so nicht an die eigentliche Modellnummer, weil Du ein Array bildest, in dem die Modellnummer nicht enthalten ist. Ich fand das am Anfang auch verwirrend, aber eigentlich ist es ganz einfach. Vergegenwärtge Dir, dass jedes Array-Element in knotenAst2 die HTML-Strukturen des Browser Dokuments enthält, die jeweils vom öffnenden, bis zum schließenden Tag Deiner gesetzten Bedingung reicht. Das ganze Vorgehen basiert übrigens auf dem DOM (Document Object Model), weshalb die Variablen zur Aufnahme der HTML-Unterstrukturen als Object deklariert werden müssen. Es sind keine Strings, weshalb man am Ende immer mit innertext oder seinen Brüdern arbeiten muss.
In Deinem Fall hast Du zu kleine HTML-Ausschnitte in knotenAst2 versammelt. Denn Du baust das Array knotenAst2 mit folgender Zeile auf:

Set knotenAst2 = browser.document.getElementsByClassName("attr-name")

Der CSS-Klassenname attr-name ist ausschließlich Tags der Tabelle zugeordnet, in der auch die Modellnummer steht. Aber, die Klasse ist span-Tags zugeordnet, die abgeschlossen werden, bevor die Zeile mit den zugeordneten Werten in der Tabelle angesprochen wird. Du sammelst also nur die Kopfzeile ein.
Dein Array ergibt sich zu folgendem:
(Spitze HTML-Klammern aus Forengründen gegen Eckige ausgetauscht)

knotenAst2(0) = [span class="attr-name" title="Type"]Type:[/span]
knotenAst2(1) = [span class="attr-name" title="Cake Tools Type"]Cake Tools Type:[/span]
knotenAst2(2) = [span class="attr-name" title="Material"]Material:[/span]
knotenAst2(3) = [span class="attr-name" title="Certification"]Certification:[/span]
knotenAst2(4) = [span class="attr-name" title="Feature"]Feature:[/span]
knotenAst2(5) = [span class="attr-name" title="Place of Origin"]Place of Origin:[/span]
knotenAst2(6) = [span class="attr-name" title="Brand Name"]Brand Name:[/span]
knotenAst2(7) = [span class="attr-name" title="Model Number"]Model Number:[/span]
knotenAst2(8) = [span class="attr-name" title="Product name"]Product name:[/span]
knotenAst2(9) = ...
knotenAst2(...) = ...
knotenAst2(n) = ...

Nun könnte man auf die Idee kommen, knotenAst2 eben aus class="attr-value" aufzubauen. Dann hat man zwar auch die Modellnummer eingefangen, man kann sie aber nicht identifizieren. Es wird also ein Array benötigt, dass die HTML-Strukturen beinhaltet, die beide notwendigen span-Tag-Zeilen enthält. Eine zur identifikation und eine mit dem gesuchten Wert.
Man schaut sich also die umgebenden Tags der HTML-Strukturen an, die wir brauchen. Dann kommt man darauf, dass alles was wir benötigen in li-Tags eingeschlossen ist:

[li]
[span class="attr-name" title="Model Number"]Model Number:[/span]
[span class="attr-value" title="JSF084"]JSF084[/span]
[/li]

Problem: Die li-Tags stehen nackt da. Die haben nicht mal ein Attribut. Jetzt gibt es zwei Wege, die man einschlagen kann. Entweder bildet man mit getElementsByTagName("li") ein Array über sämtliche li-Tags der Seite und geht sie durch oder man schaut eine Ebene höher, in was die benötigten li-Tags eingeschlossen sind.
Ich empfehle grundsätzlich die zweite Methode, da man sonst erstmal damit beschäftigt ist rauszufinden, welche Regeln man einhalten muss, um aus allen li-Tags die richtigen zu selektieren. So kann es ja sein, dass auch andere li-Tags mit class="attr-name" oder class="attr-value" versehen wurden. Wenn man sich hingegen an den Grundsatz hält, den kleinst möglichen HTML-Ausschnitt zu wählen, ist man den ganzen Rest des Seiten-Quelltextes sofort los.
Die li-Tags sind für unser Vorhaben ausserdem sehr geeignet für die empfohlene Methode. Schließlich gehören sie normalerweise zu einer Hierarchie von Tags. So auch hier. Alle li-Tags sind in einem ul-Tag vereinigt. Diesem ul-Tag wurde class="attr-list" zugewiesen.
Bevor wir uns darauf stürzen, muss unbedingt geprüft werden, ob diese CSS-Klasse noch woanders auf der Seite verwendet wird. Das ist nicht der Fall, also bilden wir als ersten Schritt ein Array mit getElementsByClassName("attr-list"). Da wir wissen, dass dieses Array nur ein einziges Element enthält, bzw. das erste Array-Element ist, können wir direkt darauf zugreifen, indem wir den Index des ersten Array-Elements angeben: getElementsByClassName("attr-list")(0).
Nur, um es noch einmal zu verdeutlichen:
Das einzige Array-Element enthält die gesamte HTML-Struktur, die vom öffnenden Tag, das den gesuchten CSS-Klassennamen attr-list enthält, bis zum schließenden Tag reicht

knotenAst2(0) =
[ul class="attr-list"]
[li]
[span class="attr-name" title="Type"]Type:[/span]
[span class="attr-value" title="Cake Tools"]Cake Tools[/span]
[/li]
[li]
[span class="attr-name" title="Cake Tools Type"]Cake Tools Type:[/span]
[span class="attr-value" title="Moulds"]Moulds[/span]
[/li]
[li]
[span class="attr-name" title="Material"]Material:[/span]
[span class="attr-value" title="Silicone, 100% eco-friendly food grade silicone"] _
Silicone, 100% eco-friendly food grade silicone[/span]
[/li]
[li]
[span class="attr-name" title="Certification"]Certification:[/span]
[span class="attr-value" title="FDA, LFGB, SGS, FDA, LFGB, RoHS by SGS"]FDA, LFGB, SGS,  _
FDA, LFGB, RoHS by SGS[/span]
[/li]
[li]
[span class="attr-name" title="Feature"]Feature:[/span]
[span class="attr-value" title="Eco-Friendly, Stocked"]Eco-Friendly, Stocked[/span]
[/li]
[li]
[span class="attr-name" title="Place of Origin"]Place of Origin:[/span]
[span class="attr-value" title="Zhejiang, China (Mainland)"]Zhejiang, China (Mainland)[/ _
span]
[/li]
[li]
[span class="attr-name" title="Brand Name"]Brand Name:[/span]
[span class="attr-value" title="SILIKOLOVE"]SILIKOLOVE[/span]
[/li]
[li]
[span class="attr-name" title="Model Number"]Model Number:[/span]
[span class="attr-value" title="JSF084"]JSF084[/span]
[/li]
[li]
[span class="attr-name" title="Product name"]Product name:[/span]
[span class="attr-value" title="9 Cavity Flower Debossing Design Silicon Cake  _
Decorating Tools Set"]9 Cavity Flower Debossing Design Silicon Cake Decorating Tools Set[/span]
[/li]
[li]
[span class="attr-name" title="Size"]Size:[/span]
[span class="attr-value" title="9.5*9.5*1.3cm"]9.5*9.5*1.3cm[/span]
[/li]
[li]
[span class="attr-name" title="Color"]Color:[/span]
[span class="attr-value" title="As picture or as your request"]As picture or as your  _
request[/span]
[/li]
[li]
[span class="attr-name" title="Weight"]Weight:[/span]
[span class="attr-value" title="91g"]91g[/span]
[/li]
[li]
[span class="attr-name" title="MOQ"]MOQ:[/span]
[span class="attr-value" title="10pcs for cake decorating set"]10pcs for cake  _
decorating set[/span]
[/li]
[li]
[span class="attr-name" title="Logo"]Logo:[/span]
[span class="attr-value" title="Embossed, Debossed, Printed(Customized)"]Embossed,  _
Debossed, Printed(Customized)[/span]
[/li]
[li]
[span class="attr-name" title="Packing"]Packing:[/span]
[span class="attr-value" title="1pc/opp bag or custom for cake decorating tools set"] _
1pc/opp bag or custom for cake decorating tools set[/span]
[/li]
[li]
[span class="attr-name" title="Temperature range"]Temperature range:[/span]
[span class="attr-value" title="-40℃~ 250℃"]-40℃~ 250℃[/span]
[/li]
[/ul]

Mit diesem HTML-Ausschnitt können wir jetzt arbeiten, wie vorher mit dem gesamten Dokument. Wie Eingangs erwähnt, handelt es sich um ein Objekt und nicht um einen String. Wir können also weiterhin alle Methoden verwenden, die auf das DOM anwendbar sind und wir können die Objektstruktur ausnutzen.
Jetzt ist die Tatsache relevant, dass die li-Tags zwar noch immer nackt dastehen, es aber nur noch relevante li-Tags gibt. Deshalb bilden wir nun das ersehnte Array aus den li-Tags. Wie gesagt, können wir die Objekt-Struktur ausnutzen. Das machen wir, indem wir getElementsByTagName("li") getrennt durch den Punkt-Operator, direkt hinter den Befehl zum Bilden des zuvor benötigten Arrays schreiben:

set knotenAst2 = browser.document.getElementsByClassName("attr-list")(0).getElementsByTagName(" _
li")

Jetzt liegt ein Array vor, das Du so verwenden kannst, wie in meinem Ausgangsskript. Am Besten, Du spielst mit diesen Strukturen mal rum und lässt Dir an unterschiedlichen Stellen z.B. mal den innertext von Array-Elementen ausgeben. Dann siehst Du z.B. dass der innertext, in dem Du mit instr() nach dem Teilstring "Model Number" suchst, auch die Modellnummer selbst bereits enthält. Warum? Weil innertext nicht auf Tag-Grenzen achtet. Es wird einfach alles ausgegeben, was reiner Text ist.
Mit dieser einigermaßen ausführlichen Erläuterung solltest Du in der Lage sein, auch andere Werte auslesen zu können.
Viele Grüße,
Zwenn
Anzeige
AW: GetElementByClass bzw. ByTagName
28.11.2017 17:05:42
Oliver
Und noch einmal vielen lieben Dank für diese ausführliche Erklärung, dass hat mir jetzt hoffentlich und wahrscheinlich die Tore in der "von Websiten Daten ziehen Welt" die Tore geöffnet. :)
Noch eine kleine Frage habe ich noch, wenn ich diesen Code:
Sub ModellNummerHolen()
Dim browser As Object   'Aufnehmen der verwendeten Instanz des Browsers (Internet Explorer)
Dim ModelNummerKnoten1 As Object 'Aufnehmen einer HTML Struktur aus dem Browser Dokument
Dim ModelNummer1 As Object    'Aufnehmen einer HTML Unterstruktur aus ModelNummerKnoten1
Dim knotenAst2 As Object 'Aufnehmen einer HTML Struktur aus dem Browser Dokument
Dim knoten2 As Object    'Aufnehmen einer HTML Unterstruktur aus ModelNummerKnoten1
Dim url As String       'Aufnehmen der auszulesenden Adresse
Dim ModelNummerKnoten2 As Object
url = "https://wholesaler.alibaba.com/product-detail/Promotion-3-Cavity-Chrysanthemum-Shape- _
Silicone_60687403155.html?spm=a2700.8304367.prewdfa4cf.19.4c0dc1b0zW7LcM"
Set browser = CreateObject("internetexplorer.application")
browser.Visible = False
browser.navigate url
Do Until browser.readyState = 4: DoEvents: Loop
Set ModelNummerKnoten1 = browser.document.getElementsByClassName("do-entry-item")
If Not ModelNummerKnoten1 Is Nothing Then
For Each ModelNummer1 In ModelNummerKnoten1
If InStr(1, ModelNummer1.innerText, "Model Number") Then
Set ModelNummer1 = ModelNummer1.getElementsByClassName("ellipsis")(0)
If Not ModelNummer1 Is Nothing Then
Debug.Print ModelNummer1.innerText
End If
End If
Next ModelNummer1
End If
Set ModelNummerKnoten1 = Nothing
Set ModelNummer1 = Nothing
Set ModelNummerKnoten2 = browser.document.getElementsByClassName("attr-list")(0). _
getElementsByTagName("li")
If Not ModelNummerKnoten2 Is Nothing Then
For Each ModelNummer2 In ModelNummerKnoten2
If InStr(1, ModelNummer2.innerText, "Model Number") Then
Set ModelNummer2 = ModelNummer2.getElementsByClassName("attr-value")(0)
If Not ModelNummer2 Is Nothing Then
Debug.Print ModelNummer2.innerText
End If
End If
Next ModelNummer2
End If
Set ModelNummerKnoten2 = Nothing
Set ModelNummer2 = Nothing
browser.Quit
Set browser = Nothing
Set ModelNummerKnoten1 = Nothing
End Sub

Benutze wird zwar die Model Nummer vom Produkt ausgegeben, doch das Programm crasht eben beim zweiten Teil, da es ja diesen Array nicht gibt. Doch wenn ich den Code aber an der zweiten Suchfunktion in diesen abändere gibt es keinen Crash:
If Not browser.document.getElementsByClassName("attr-list")(0).getElementsByTagName("li") Is  _
Nothing Then
For Each ModelNummer2 In browser.document.getElementsByClassName("attr-list")(0). _
getElementsByTagName("li")
If InStr(1, ModelNummer2.innerText, "Model Number") Then
Set ModelNummer2 = ModelNummer2.getElementsByClassName("attr-value")(0)
If Not ModelNummer2 Is Nothing Then
Debug.Print ModelNummer2.innerText
End If
End If
Next ModelNummer2
End If
Aber was macht das für ein Unterschied für das Programm, wenn das Objekt nicht gesetzt wird ? Es schluckt mehr Leistung, weil die Objekte nachdem der Befehl fertig ist nicht gelöscht werden können oder dient das wirklich nur der Übersichtlichkeit? Würde trotzdem gerne den Fehler beheben, da es eben übersichtlicher ist also wäre super, wenn du mir auch noch das erklären könntest, warum das Programm hier seinen Geist aufgibt.
Liebe Grüße
Oliver
Anzeige
AW: GetElementByClass bzw. ByTagName
29.11.2017 00:18:21
Zwenn
Hallo Oliver,
da es schon spät ist, fasse ich mich mal etwas kürzer. Ich ging davon aus, dass Du die richtigen Codeabschnitte nur auf die richtigen URLs loslässt. Allerdings ist mein Ansatz auch nicht ganz zu Ende gedacht, denn die Zeile:

If Not ModelNummerKnoten2 Is Nothing Then

matcht gar nicht, wenn die Zeile vorher nicht richtig funktioniert. Ich hatte erklärt, dass du Konstrukte wie:

...getElementsByClassName("attr-list")(0).getElementsByTagName("li")

aufbauen kannst. Das stimmt auch, wie Du vermutlich festgestellt hast. Wenn jedoch das erste Array getElementsByClassName("attr-list")(0) gar nicht gebildet werden kann, dann versucht das Folgeglied der aufgebauten Kette getElementsByTagName("li"), auf ein Objekt zuzugreifen, dass es nicht gibt. Deshalb crasht der Code.
Du kannst es also entweder so machen, wie Deine Lösung aufzeigt, direkt in der If-Struktur, oder Du brichst die benötigte HTML-Struktur Zeilenweise runter:

Set ModelNummerKnoten2 = browser.document.getElementsByClassName("attr-list")(0)
If Not ModelNummerKnoten2 Is Nothing Then
Set ModelNummerKnoten2 = ModelNummerKnoten2.getElementsByTagName("li")
If Not ModelNummerKnoten2 Is Nothing Then

Du solltest übrigens in jedem Modul als erste Zeile
Option Explicit

eintragen. Das prüft, ob alle verwendeten Variablen auch definiert wurden. Du hast ModelNummer2 vergessen. Das ist ansich nicht so wild. VBA erzeugt die Variable einfach, sobald sie verwendet wird. Es werden allerdings auch Variablen erzeugt, die lediglich Schreibfehler der gemeinten Variable sind und dann suchst Du mitunter nach einem echt ätzenden Fehler.
Um Daten von Internetseiten auszulesen gibt es noch andere Techniken. Z.B. wenn Du auf Attribute zugreifen willst oder Links auslesen musst. Noch spezieller wird es, wenn ein Teil des Seitencodes durch JavaScript erzeugt wird. Dann muss man unter Umständen die richtige JS Funktion identifizieren und über VBA auslösen, um dann auf Code zuzugreifen, der in der Quelltextansicht der Hauptseite unsichtbar ist ;-) Aber Du bist schon auf einem guten Weg denke ich :-)
Viele Grüße,
Zwenn
Anzeige
AW: GetElementByClass bzw. ByTagName
30.11.2017 11:41:48
Oliver
Super Vielen Dank für deine ganze Hilfe!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge