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
1632to1636
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

Daten aus Internetseite in Excel

Daten aus Internetseite in Excel
09.07.2018 20:12:56
anski100
Hallo zusammen,
Die angehangene Excel soll aus dem Quellcode der Seite https://www.hit.de/angebote-leipzig/alle-angebote.html folgende Informationen in Tabelle4 übertragen.
Den Namen des Produktes welcher mit <h4> </h4>~f~ getagt wird siehe Bsp. unten
~f~<h4>Bärenmarke Die frische Milch oder H-Milch</h4>~f~
-->habe ich hin bekommen und passt soweit
Den Packungsgröße welche mit~f~ <br> <br>~f~ getagt ist
~f~<br> 1 l Packung<br> ~f~
-->geht nicht, wobei ich über Umwege mehr Informationen bekomme als ich brauche welche ich dann rausfiltern könnte
~f~<img src="<b>/price.png?price=88&compprice=109&type=13</b>" class="wv_price" />~f~
-->Hier brauche ich wirklich nur den geschriebenen link in der Excel, sprich /price.png?price=88&compprice=109&type=13
Bei einen anderen Projekt ging das über getElementsByClassName jetzt aber irgendwie nicht
Und als letztes wäre auch der Link von dem Bild noch ein nice to have aber kein muss
~f~<img src="/offer.png?IMAGENAME01=%2Fapi%2Ftmp%2Fdl%2F6182483_db7add627b06ac7d6c67023616fc348e.png&IMAGENAME03=%2Fapi%2Ftmp%2Fdl%2F6181452_2eeb72757ac9c5ea1e5e5b603401b457.png&width=260&inset=" />
https://www.herber.de/bbs/user/122570.xlsm
Vielen Dank

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Daten aus Internetseite in Excel
10.07.2018 01:00:26
Zwenn
Hallo anski100,
man kann die Informationen auslesen, die Du haben möchtest. Jetzt ist es aber schon ziemlich spät. Ich gucke morgen nochmal drauf, falls nicht jemand anders eine Lösung hat, bevor ich dazu komme.
Im Moment nur folgendes:
Wenn Du solche Seiten auslesen willst, dann suche immer nach Mustern. Solche Shops (oder auch Foren und andere Seiten mit wiederkehrenden gleichartigen Infoermations-Strukturen), haben immer ein Muster, nach dem sie aufgebaut sind. Danach kann man gezielt suchen. So sind im vorliegenden Code der Seite alle Angebote in eigene article-Tags gekapselt. Die würde ich im ersten Schritt in eine Objektvariable einlesen. Dabei ergibt sich ein Array, welches die article-Tag-Strukturen als einzelne Einträge hat. Diese kann man dann nacheinander durchgehen. Deine Tabelle4 wird dann automatisch Zeilenweise aufgebaut.
So eine Seite, ihr Code, wird vom Browser in einer Baumstruktur verwaltet. Die nennt sich DOM (Document Object Model). Man kann den HTML-Code damit nacheinander immer feiner sezieren. So ist die Information "Mengenangabe", an die Du nicht richtig rankommst, nicht in einem eigenen Tag enthalten und auch nicht einer eigenen CSS Klasse zugeordnet. Man kann aber trotzdem dran kommen, wenn man das umliegende p-Tag in eine Objektvariable einliest. Anschlieschend kann man dann das darin mit enthaltene span-Tag entweder rausschmeißen und die Mengenangabe mit innertext bekommen oder man hangelt sich mit firstChild und nextSibbling durch die Baumstruktur. Was sich da anbietet hängt davon ab, wie die anderen Angebote so aufgebaut sind. Der innere Aufbau von so einer (in diesem Fall) Artikel-Box muss nicht immer zwingend exakt gleich sein.
Den Bilderlink auszulesen sollte kein Problem sein.
Soweit erstmal meine Gedanken dazu. Wann ich morgen dazu komme etwas zu programmieren weiß ich noch nicht.
Viele Grüße,
Zwenn
Anzeige
AW: Daten aus Internetseite in Excel
10.07.2018 05:54:42
anski100
Hallo Zwenn,
Danke für die Info. Wäre Klasse wenn du nochmal Zeit finden würdest.
Ich versuch mein Glück heute Abend auch nochmal mit den von dir genannten Tipps.
Danke
AW: Daten aus Internetseite in Excel
10.07.2018 08:48:24
ChrisL
Hi
Der Vorschlag mit DOM ist vermutlich präziser/verlässlicher, aber folgendes sollte auch funktionieren.
Sub t()
Dim objHTTP As Object
Dim arrSplitTitel As Variant, arrTitel() As Variant
Dim arrSplitBilder As Variant, arrBilder() As Variant
Dim i As Integer, intCounter As Integer
Set objHTTP = CreateObject("MSXML2.XMLHTTP")
Call objHTTP.Open("GET", "https://www.hit.de/angebote-leipzig/alle-angebote.html", False)
objHTTP.send
arrSplitTitel = Split(objHTTP.responsetext, "<h4>")
arrSplitBilder = Split(objHTTP.responsetext, "<img src=""")
For i = LBound(arrSplitTitel) + 1 To UBound(arrSplitTitel)
ReDim Preserve arrTitel(intCounter)
arrTitel(intCounter) = Left(arrSplitTitel(i), InStr(1, arrSplitTitel(i), "<") - 1)
intCounter = intCounter + 1
Next i
intCounter = 0
For i = LBound(arrSplitBilder) + 1 To UBound(arrSplitBilder)
If InStr(1, arrSplitBilder(i), "/offer.png") Then
ReDim Preserve arrBilder(intCounter)
arrBilder(intCounter) = Left(arrSplitBilder(i), InStr(1, arrSplitBilder(i), """") - 1)
intCounter = intCounter + 1
End If
Next i
Range("A1:A" & UBound(arrTitel) + 1) = Application.Transpose(arrTitel)
For i = LBound(arrBilder) To UBound(arrBilder)
Cells(i + 1, 2) = arrBilder(i)
Next i
End Sub
cu
Chris
Anzeige
AW: Daten aus Internetseite in Excel
10.07.2018 13:09:49
Zwenn
Hallo zusammen,
wie immer gibt es mehrere Lösungen, ist ja auch gut so :-) Bei Dir Chris, fehlt allerdings die Mengenangabe und auch die Links sind nicht vollständig. Man kann die direkt inklusive Domain auslesen.
Beim Ausprobieren ist mir etwas aufgefallen, was ich auch in den Kommentaren des Makros nochmal genant habe. Aber weil es so wichtig ist, weise ich hier nochmal ganz explizit darauf hin:
Achtung: Um wirklich auf die Angebotsseite des richtigen Marketes zu kommen, muss man im Internet Explorer einmal die gewünschte Stadt Als "Mein Markt" markieren. Macht man das nicht, wird immer die Angebotsseite vom Markt in Siegburg ausgelesen!
Fürs Auslesen lasse ich den IE mal sichtbar und am Ende auch geöffnet. So hat man eine direkte Sichtkontrolle, ob wirklich die Seite zum richtigen Markt (in der richtigen Stadt) geöffnet wurde. Die Angebote unterscheiden sich teilweise. Das habe ich kontrolliert.
Alles ins gleiche Modul:

Option Explicit

Sub HitAngeboteHolen()
Dim browser As Object
Dim url As String
Dim knoten As Object
Dim knotenStamm As Object
Dim knotenAst As Object
Dim knotenZweig As Object
Dim zielTabelle As String
Dim zeileZielTabelle As Long
Dim spalteZielTabelle As Byte
Dim angebotsText As String
Dim angebotsBeschreibung As String
Dim angebotsPreis As String
Dim angebotsMenge As String
'Tabelle für die Ausgabe der ausgelesenen Daten
zielTabelle = "Tabelle4"
'Zeile und Spalte für die Ausgabe initialisieren
zeileZielTabelle = 2
spalteZielTabelle = 1
'Adresse der Angebotsseite
'Achtung: Um wirklich auf die Angebotsseite des richtigen Marketes zu kommen,
'muss man im Internet Explorer einmal die gewünschte Stadt als "Mein Markt" markieren
'Macht man das nicht, wird immer die Angebotsseite vom Markt in Siegburg ausgelesen!
url = "https://www.hit.de/angebote-leipzig/alle-angebote.html"
'Internet Explorer initialisieren, Sichtbarkeit festlegen,
'Seite im IE aufrufen und warten bis sie vollständig geladen ist
Set browser = CreateObject("internetexplorer.application")
browser.Visible = True
browser.Navigate url
Do Until browser.readyState = 4: DoEvents: Loop
'Artikel-Boxen aus dem Quellcode der Seite in ein Array separieren
Set knoten = browser.document.getElementsByTagName("article")
'Wenn Artikel vorhanden, dann einen nach dem anderen in die Tabelle schreiben
If Not knoten Is Nothing Then
'Alle Angebote durchgehen
For Each knotenStamm In knoten
'Angebotstitel holen
Set knotenAst = knotenStamm.getElementsByTagName("h4")(0)
'Titel in die Tabelle schreiben, wenn der erste Tag
'h4 im aktuell bearbeiteten Angebot gefunden wurde
If Not knotenAst Is Nothing Then
Sheets(zielTabelle).Cells(zeileZielTabelle, spalteZielTabelle).Value = _
knotenAst.innertext
End If
'Ausgabespalte für die Mengenangabe setzen
spalteZielTabelle = spalteZielTabelle + 1
'Menganangabe holen
'Die Mengenangabe steht innerhalb des ersten p-Tags in einer article-Box
'darin enthalten ist ein span-Tag mit Zusatzinformationen und
'manchmal ein small-Tag mit Preisangabe pro Mengeneinheit.
'Es gibt verschiedene Wege, um an die gewünschte Mengenangabe zu kommen
'Hier nehmen wir den innertext des p-Tag, des span-Tag und des small-Tag
'Da im p-Tag sowohl das span- wie small-Tag enthalten sind, können wir den
'gewünschten Text bekommen, indem aus dem p-Tag-String (sofern vorhanden)
'den span-Tag-String und den small-Tag-String entfernen
Set knotenAst = knotenStamm.getElementsByTagName("p")(0)
'Wenn p-Tag vorhanden, Stringbearbeung vornehmen
If Not knotenAst Is Nothing Then
'Gesamten Text innerhalb des p-Tags übernehmen
'(enthält auch Text innenliegender Tags)
angebotsText = knotenAst.innertext
'Eventuell enthaltenen span-Tag aus p-Tag auslesen
Set knotenZweig = knotenAst.getElementsByTagName("span")(0)
'Wenn span-Tag in p-Tag vorhanden, Text übernehmen
If Not knotenZweig Is Nothing Then
angebotsBeschreibung = knotenZweig.innertext
End If
'Eventuell enthaltenen small-Tag aus p-Tag auslesen
Set knotenZweig = knotenAst.getElementsByTagName("small")(0)
'Wenn small-Tag in p-Tag vorhanden, Text übernehmen
If Not knotenZweig Is Nothing Then
angebotsPreis = knotenZweig.innertext
End If
'Textteile von span-Tag und small-Tag aus p-Tag-Text entfernen
angebotsMenge = Replace(angebotsText, angebotsBeschreibung, "")
angebotsMenge = Replace(angebotsMenge, angebotsPreis, "")
'Zeilenumbrüche (durch br-Tags) und überzählige Leerzeichen entfernen
angebotsMenge = KeineZeilenUmbrueche(angebotsMenge)
angebotsMenge = Replace(angebotsMenge, "  ", " ")
'Mengenangabe ausgeben
Sheets(zielTabelle).Cells(zeileZielTabelle, spalteZielTabelle).Value = _
Trim(angebotsMenge)
End If
'Ausgabespalte für die Bilderlink setzen
spalteZielTabelle = spalteZielTabelle + 1
'Bilderlink auslesen
'Der Bilderlink kann im ersten oder zweiten img-Tag stehen
'Das richtige img-Tag liegt jedoch innerhalb eines div-Tags mit
'einer eigenen CSS-Klasse. So kommt man immer an den richtigen
'Bilderlink
Set knotenAst = knotenStamm.getElementsByClassName("wv_product text-center ")(0)
'Bilderlink aus erstem Tag mit gesuchter CSS-Klasse holen, wenn vorhanden
If Not knotenAst Is Nothing Then
Set knotenZweig = knotenAst.getElementsByTagName("img")(0)
If Not knotenZweig Is Nothing Then
Sheets(zielTabelle).Cells(zeileZielTabelle, spalteZielTabelle).Value = _
knotenZweig.src
End If
End If
'Ausgabezeile für nächstes Angebot setzen und
'Ausgabespalte für nächsten Angebotstitel setzen
zeileZielTabelle = zeileZielTabelle + 1
spalteZielTabelle = 1
'Nächstes Angebot bearbeiten
Next knotenStamm
Else
'Wenn kein Artikel vorhanden, einen Hinweis ausgeben
MsgBox "Es wurde kein Artikel gefunden"
End If
'Aufräumen
'    browser.Quit
Set browser = Nothing
Set knoten = Nothing
Set knotenStamm = Nothing
Set knotenAst = Nothing
Set knotenZweig = Nothing
End Sub

Function KeineZeilenUmbrueche(zuSaeubern As String) As String
Dim vergleichVorAustausch As String
Dim vergleichNachAustausch As String
vergleichVorAustausch = zuSaeubern
Do
vergleichNachAustausch = vergleichVorAustausch
vergleichVorAustausch = Replace(vergleichVorAustausch, Chr(10), " ")
Loop Until vergleichNachAustausch = vergleichVorAustausch
Do
vergleichNachAustausch = vergleichVorAustausch
vergleichVorAustausch = Replace(vergleichVorAustausch, Chr(13), " ")
Loop Until vergleichNachAustausch = vergleichVorAustausch
KeineZeilenUmbrueche = vergleichVorAustausch
End Function
Schick machen musst Du Dir die Tabelle selbst ;-) Daten werden ab Zeile 2 eingetragen. Es wird nicht geprüft, ob Daten in der Tabelle stehen. Ggf. werden vorhandene also einfach überschrieben. Als Zieltabelle habe ich Deine 'Tabelle4' übernommen. Das kannst Du ggf. oben im Makro einfach ändern. Den String für die Mengenangaben habe ich soweit gesäubert, dass er ordentlich in der Tabelle landet.
Viele Grüße,
Zwenn
Anzeige
AW: Daten aus Internetseite in Excel
10.07.2018 17:46:56
anski100
Super Danke
Funktioniert einwandfrei
Wunderbar, so soll es sein :-) (owT)
11.07.2018 16:07:13
Zwenn
Preislink vergessen
10.07.2018 13:45:04
Zwenn
Habe vergessen den Preislink mit auszulesen. Folgenden Code einfach vor

'Ausgabespalte für den Bilderlink setzen
spalteZielTabelle = spalteZielTabelle + 1

einkopieren

'Ausgabespalte für den Preislink setzen
spalteZielTabelle = spalteZielTabelle + 1
'Preislink auslesen
'Der Preislink steht im img-Tag mit der CSS-Klasse "wv_price"
Set knotenAst = knotenStamm.getElementsByClassName("wv_price")(0)
'Preislink aus erstem Tag mit gesuchter CSS-Klasse holen, wenn vorhanden
If Not knotenAst Is Nothing Then
Sheets(zielTabelle).Cells(zeileZielTabelle, spalteZielTabelle).Value = knotenAst.src
End If

Anzeige

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige