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

Abfrage Tabelle aus 2. Seite bei XHTML & Dyn Link

Abfrage Tabelle aus 2. Seite bei XHTML & Dyn Link
29.06.2017 22:05:12
Martin
Ein Hallo an Alle!
Habe ein Problem mit einer Abfrage von folgender Page:
https://www.e-control.at/konsumenten/service-und-beratung/toolbox/tarifkalkulator?p_p_id=tk_portlet_WAR_tk&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_tk_portlet_WAR_tk__facesViewIdRender=%2FsearchResult.xhtml
Die Abfrage bei: https://www.e-control.at/konsumenten/service-und-beratung/toolbox/tarifkalkulator
funktioniert! Dh PLZ & Kwh Eingabe & Senden
Die nachfolgende Tabelle kann ich zwar abfragen, ist aber leider nicht mein Ziel.
Dort kann man auf die Energielieferanten klicken und die Tabelle die danach kommt würde ich gerne mit meiner Excel Tabelle abgleichen!
Bedeutet in Zelle A:A habe ich die gefragten Abfragefelder eingetragen & in den Spalten daneben hätte ich gerne die Ergebnisse inkl. A:Z 1 & B:Z 2 die Energielieferanten & Produkte.
VBA code: (bisher):
Option Explicit
Sub TableExample()
Dim ws As Worksheet
Dim IE As Object
Dim doc As Object
Dim strURL As String
Dim i As Integer
strURL = "https://www.e-control.at/konsumenten/service-und-beratung/toolbox/tarifkalkulator" _
_
' replace with URL of your choice
Set IE = CreateObject("InternetExplorer.Application")
With IE
.Visible = True
.navigate strURL
Do Until .ReadyState = 4: DoEvents: Loop
Do While .Busy: DoEvents: Loop
Application.Wait (Now + TimeValue("0:00:10"))
IE.Document.getElementById("_tk_portlet_WAR_tk_:tk-form-start:tk-index-search-  _
_
form-zip").Value = _
Sheets("Tarife e-control config").Range("A1").Value
IE.Document.getElementById("_tk_portlet_WAR_tk_:tk-form-start:tk-index-search-  _
_
form-electricity-consumption").Value = _
Sheets("Tarife e-control config").Range("A2").Value
'click the 'go' button
IE.Document.getElementById("_tk_portlet_WAR_tk_:tk-form-start:tk-index-search-  _
_
form-search-button").Click
Do Until .ReadyState = 4: DoEvents: Loop
Do While .Busy: DoEvents: Loop
Application.Wait (Now + TimeValue("0:00:10"))
Set doc = IE.Document.GetElementsByTagName("table")
Set ws = Sheets("einLink")
FindAllLinks doc, IE
End With
End Sub

Sub FindAllLinks(doc As Object, IE As Object)
Dim ws As Worksheet
Dim dieLinks As Object
Dim einLink As Object
Dim tbl As Object
Dim L As Long
Dim Zeile As Long
Dim tblanz As Long
Set IE = CreateObject("InternetExplorer.application")
Set dieLinks = doc.Item(L).Document.Links
Set ws = Sheets("einLink")
For Each einLink In dieLinks
Zeile = Zeile + 1
'Stop
'Schau dir jetzt im Lokalfenster die Eigenschaften von einLink an.
'Da gibt es so allerhand was du auswerten kannst.
ws.Cells(Zeile, 1) = einLink.href
ws.Cells(Zeile, 2) = "'" & einLink.outerText
Next einLink
GetAllTables doc
'End With
End Sub


Sub GetAllTables(doc As Object)
' get all the tables from a webpage document, doc, and put them in a new worksheet
Dim ws As Worksheet
Dim rng As Range
Dim tbl As Object
Dim rw As Object
Dim cl As Object
Dim tabno As Long
Dim nextrow As Long
Dim i As Long
Dim xl As String
Dim y As Integer
Set ws = Sheets("Stocks")
For Each tbl In doc
tabno = tabno + 1
nextrow = nextrow + 1
Set rng = ws.Range("B" & nextrow)
rng.Offset(, -1) = "Table " & tabno
For Each rw In tbl.Rows
For Each cl In rw.Cells
rng.Value = cl.outerText
Set rng = rng.Offset(, 1)
i = i + 1
Next cl
nextrow = nextrow + 1
Set rng = rng.Offset(1, -i)
i = 0
Next rw
Next tbl
ws.Cells.ClearFormats
End Sub
Hoffe Ihr könnt mir dabei helfen bin schon langsam echt ratlos!!
Danke im Voraus!

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Abfrage Tabelle aus 2. Seite bei XHTML & Dyn Link
30.06.2017 11:00:37
Martin
Keiner der mir helfen kann?
Benötige dringend einen Plan!
Bitte!
Plan ;-)
30.06.2017 13:22:36
Zwenn
Hallo Martin,
nachdem ich mir die Seite genauer angesehen habe, habe ich Dein Problem verstanden. Ich habe leider keine Zeit eine fertige Lösung zu basteln, aber die Aufgabenstellung ist nicht grade trivial und würde mich schon interessieren.
Die Krux an der Sache ist, dass alle Energieversorger über exakt den gleichen Link aufgerufen werden. Das Einsammeln aller Links mit anschließendem Abklappern entfällt also. Aber das hast Du sicher auch bereits selber gemerkt. Also geht es nur über "hin und her Navigation".
Wie Du bis zur Liste mit den Anbietern kommst weißt Du ja. Auf dieser Seite musst Du es schaffen in der Tabelle die einzelnen Anbieter über ihren Namen mit dem dahinterliegenden (immer gleichen) Link zu identifizieren. Wenn Du das hinbekommst, kannst Du den ersten so "anklicken", dass die Tabelle, die Du auslesen willst im gleichen Fenster erscheint. Also so, wie es auch nur geht, wenn man es manuell macht.
Das sollte sinngemäß so gehen:

If link.innertext = ANBIETERNAME Then
link.Click
end if

Nachdem Du die benötigten Daten ausgelesen hast, musst Du quasi auf den Zurück-Button des Browsers klicken. Das geht mit:
IE.GoBack

Dann bist Du wieder in der Anbieterliste. Dort musst Du dann "einfach" den nächsten Anbieter "anklicken" usw.
Um die Anbieter nacheinander abzuklappern, liest Du die benötigten Namen am besten in eine Tabelle oder ein Array ein. Jedesmal, wenn Du einen abgearbeitet hast, markierst Du ihn als abgearbeitet. So kannst Du für den nächsten Durchgang einfach Prüfen, welcher Anbieter als nächstes angeklickt werden muss bzw. ob die Liste fertig abgearbeitet wurde.
Dieses Vorgehen ist sehr theoretischer Natur. Ich habe das noch nie ausprobiert, weiß aber, dass der IE mitunter sehr zickig reagiert, wenn man viel in einer geöffneten Instanz navigiert, ohne sie zwischendurch zu schließen. Im Zweifelsfall schließt Du den IE zwischendurch und navigierst wieder in die Anbieterliste, in der Du dank Deiner Statusliste (wer ist schon abgearbeitet) einfach an der Stelle weitermachen kannst, an der Du aufgehört hast.
Viel Glück und falls das klappt, würde ich mich interessieren, ob in einem Rutsch oder ob der IE wirklich immer mal wieder neu gestartet werden muss.
Viele Grüße,
Zwenn
Anzeige
AW: Plan ;-)
30.06.2017 15:02:42
Martin
Hallo Zwenn,
danke für Deinen Input! Ja das war auch mein Plan!
Ja genau dabei bin ich gerade und Du hast das Problem richtig verstanden!
Das Problem ist das diese Abfrage leider nicht so funktioniert wie Du hier geschrieben hast.
Ich habe mir die Anbieter in eine Excel Tabelle geladen und dort in der Spalte C Stehen ab Zeile 24 die Anbieter zwar drinnen. Das Problem ist das dort sehr viele Leerzeichen drinnen stehen und zusätzlich noch z.B. " Verbund AG 100% " (als Beispiel). Ich lade das 1:1 in eine Variable und suche danach im Innertext nur das es leider nicht gefunden wird.
Hoffe Du hast einen Plan B außer den Manuellen Weg über copy & Past.
Lg Martin
Anzeige
AW: Plan ;-)
30.06.2017 15:42:18
Zwenn
Nur auf die Schnelle, um Dich hoffentlich in die richtige Richtung zu lenken.
Ich habe Deinen Quellcode nicht im Detail analysiert. Aber soweit ich gesehen habe, arbeitest Du doch über das DOM (Document Object Modell)? Also mit getElementsByTagName() usw. Im Quelltext der Seite kannst Du die Firmennamen rausfinden über:

Dim knotenAst as Object
Dim knoten as Object
set knotenAst = IE.document.GetElementsByTagName("span")
If Not knotenAst is Nothing Then
For each knoten in knotenAst
If knoten.GetAttribute("title") = "" Then
ZelleInDieDuDenFirmennamenSchreibenWillst.Value = knoten.innertext
End If
Next knoten
End If
Das funktioniert, weil es das Attribut title mit dem Wert "" ausschließlich in Span-Tags gibt, die mit den Firmen zu tun haben. Z.B. [span title=""]ENSTROGA[/span] (Spitze gegen Eckige Klammern ausgetauscht wegen Darstellung hier)
Bei diesem Vorgehen musst Du allerdings jeden zweiten Treffer rausschmeißen, weil die Produktinfo "Vollstrom", "grünstrom 12", usw. in der 2. Spalte genauso aufgebaut sind und auch dem gleichen Link folgen. Der Link wird übrigens (logischer Weise) über ein JavaScript aufgebaut.
Für ZelleInDieDuDenFirmennamenSchreibenWillst musst Du natürlich noch einen Mechanismus integrieren, der dafür sorgt, dass nicht immer in die selbe Zelle geschrieben wird, sondern am Ende eine Liste entsteht.
Die Span-Tags mit diesen Firmennamen stehen alle innerhalb der a-Tags, also der Links. Das bedeutet, Du kannst anschließend wieder mit getElementsByTagName("a") alle Links holen und in einer weiteren Schleife abklappern. In der musst Du dann auf innertext und die zuvor rausgefundenen Firmennamen abfragen. Ausserdem findet in dieser Schleife die Navigation mit Link anklicken und dem zurückspringen im Browser statt.
Wie gesagt, das ist nicht trivial.
Anzeige
Geht auch über die IDs
30.06.2017 16:10:23
Zwenn
Nochmal ich,
habe grade gesehen, dass die Links mit eindeutigen IDs versehen sind. Die sind immer gleich aufgebaut und einfach durchnummeriert. Mit getElementByID() kannst Du also ganz direkt auf die richtigen Inhalte zugreifen. Du musst nur abfangen, wenn eine ID beim hochzählen nicht mehr vorhanden ist. Das ist wesentlich einfacher, als mein Vorschlag im letzten Posting.
Aufbau der IDs:

[a id="_tk_portlet_WAR_tk_:tk-search-results-suppliers-form:tk-search-results-suppliers-table:0: _
tk-truncate-value-supplier" ...
[a id="_tk_portlet_WAR_tk_:tk-search-results-suppliers-form:tk-search-results-suppliers-table:1: _
tk-truncate-value-supplier" ...
[a id="_tk_portlet_WAR_tk_:tk-search-results-suppliers-form:tk-search-results-suppliers-table:2: _
tk-truncate-value-supplier" ...

Anzeige
AW: Geht auch über die IDs
30.06.2017 16:26:18
Zwenn
Also, damit kannst Du Dir das ganze innertext Geraffel sparen. Ist klar oder? Einfach alle Links direkt "anklicken" und die Daten auslesen, die Du brauchst. Du musst nur mitzählen, bei welchem Link Du grade bist. Nach dem zurückspringen auf die Anbieterliste im Browser "klickst" Du einfach den nächsten Link an.
AW: Geht auch über die IDs
01.07.2017 08:00:25
Martin
Hallo Swenn,
Danke für die Info!
Das mit den IDs, wusste ich noch nicht. Habe ich anscheinend übersehen das bei der table: die nummer hinten dran steht. Das ist eine gute Lösung und werde ich womöglich noch brauche für meine nächste abfrage bei den Details.
Nur habe ich leider im Moment ein ganz anderes Problem:
Wenn ich auf die Detail-Liste per click funktion gehe und nachher mit IE.goBack wieder retour bekomme ich bei meiner nächsten Abfrage den Fehler "Zugriff verweigert". Kennt jemand von euch das Problem? Ich denke es liegt an der Variable oder an der SessionID.
Lg Martin
Anzeige
AW: Plan ;-)
01.07.2017 07:50:33
Martin
Hallo Zwenn danke für die Info!
Den Teil habe ich eigentlich über die Table gelöst.
Dort hole ich mir alle Tables rein und teile sie in Spalten und Zeilen auf. Somit bekomme ich in der Spalte C ab Zeile 24 untereinander alle Firmennamen. Diese musste ich dann noch bearbeiten, wo ich alle Zeilenumbrüche entferne die z.b. 100% herausfilter und ein Leerzeichen am Ende Trimme.
Jetzt habe ich den Firmennamen den Ich abrufen kann.
Lg Martin

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige