Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Bestimmten String aus Webseite auslesen

Bestimmten String aus Webseite auslesen
16.10.2015 11:25:04
jockel
Hallo,
kann ich per VBA ein bestimmte Webseite öffnen, Innerhalb der Webseite nach einem eindeutigen String suchen, zB: "Vorhaben intern" und alles, was sich rechts neben disem String befindet (Text) , kopieren und in Excel in eine Bestimmte Zelle schreiben ?
Danke
Gruß Jockel

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
PS: Bestimmten String aus Webseite auslesen
16.10.2015 11:26:16
jockel
PS: die Webseite muss nicht sichtbar geöffnet sein, das auslesen kann auch im Hintergrund passieren.
Wäre mir fast lieber

AW: PS: Bestimmten String aus Webseite auslesen
16.10.2015 14:55:36
jockel
Sorry, habe vergessen , auf nicht beantwortet zu setzen

eine Möglichkeit...
17.10.2015 16:27:54
Michael
Hi Jockel,
versuch mal das:
Option Explicit
Sub GetTextAusSite()
Dim sURL As String, sResult As String
Dim von As Long, bis As Long
sURL = "https://wiki.selfhtml.org/"
sResult = GetHTTPResult(sURL)
von = InStr(1, sResult, "Vollständiges")
MsgBox von
bis = InStr(von, sResult, "http://stackoverflow.com/questions/18163560/excel-vba-http-request-download-data-from-yahoo-finance
Dim XMLHTTP As Variant, sResult As String
Set XMLHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
XMLHTTP.Open "GET", sURL, False
XMLHTTP.Send
sResult = XMLHTTP.Status & " - " & XMLHTTP.StatusText & vbLf & XMLHTTP.ResponseText
Set XMLHTTP = Nothing
GetHTTPResult = sResult
End Function

Das WinHttpRequest holt die Seite im Hintergrund.
Die Frage ist, bis wohin Du suchen möchtest. Man könnte evtl. den verbleibenden String (nach dem 1. instr) mit split in ein Array stecken und die erste Zeile ausgeben.
Ich vermute, daß Du weißt, was nach dem gesuchten Text kommt, also habe ich mal zu Testzwecken nach der spitzen Klammer gesucht (also dem nächsten vorhandenen HTML-Tag): das kannst Du nach Bedarf ändern.
Happy Exceling,
Michael
P.S.: ich sehe grade, daß die untere Funktion dem eigentlichen Text die Server-Status-Info voranstellt - die könnte man abfragen. "200" steht für Server ok.

Anzeige
AW: eine Möglichkeit...
19.10.2015 09:03:24
jockel
Hallo MIchael,
Danke für Deine Hilfe.
Habe den Code mal getestet. Bei mir kommt eine Fehlermeldung :
"der Servername oder die Serveradresse konnte nicht verarbeitet werden"
Tritt auf bei "XMLHTTP.Send"
Funktioniert das Beispiel bei dir ? Oder kann es sein, dass mir ein Verweis fehlt ?
Wie sieht den das Ergebnis aus ?
Danke noch mal.
Gruß
Jockel

Anzeige
noch eine Möglichkeit...
19.10.2015 16:54:14
Michael
Hi Jockel,
das kann ich nicht nachvollziehen: es läuft bei mir sowohl mit X2000 als auch mit 2007 - direkt aus dem Browser in den VB-Editor kopiert.
Kann es sein, daß Du ein 64-bit-Windows hast, bei dem das Objekt nicht mehr vorhanden ist? Obwohl... dann müßte eine Fehlermeldung bereits vorher erscheinen.
Egal. Es gibt auch andere "Objekte" mit ähnlicher Funktion; kann man u.a. nachlesen bei:
http://waidner-itsolutions.de/2012/11/webservices-mit-vba-ansprechen/
oder
https://www.herber.de/forum/archiv/1304to1308/1306802_MSXML2XMLHTTPObjekt_parsen_GetElementByID.html
Ich habe die Funktion mal in meinen Schnipsel eingebaut:
Sub b()
Dim objXMLHTTP As Object
Dim sURL As String, sResult As String
Dim von As Long, bis As Long
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
sURL = "https://wiki.selfhtml.org/"
' sResult = GetHTTPResult(sURL)
objXMLHTTP.Open "GET", sURL, False
objXMLHTTP.Send
MsgBox "Status: " & objXMLHTTP.Status
sResult = objXMLHTTP.ResponseText
Set objXMLHTTP = Nothing
von = InStr(1, sResult, "Vollständiges")
MsgBox von
bis = InStr(von, sResult, "

der wiederum mit 2007 anstandslos läuft.
Von gibt übrigens irgendwas mit 9000 aus, bis ein bißchen mehr, und ausgegeben wird dann "Vollständiges Inhaltsverzeichnis" oder so.
Bin neugierig, ob das dann tut.
Schöne Grüße,
Michael

Anzeige
AW: noch eine Möglichkeit...
20.10.2015 11:53:15
jockel
Hallo Michael,
ja, Danke, es funktioniert nun. :-)
Weiß nicht, warum es vorher nicht ging, aber dieses Beispiel funzt nun.
Noch eine Frage: ich habe festgestellt, wenn das gesucht Ergebnis reine Text ist, funktioniert der Code ohne Probleme. Es gibt aber auch Seiten, die teilweise mit Java laufen.
(Das ist jetzt eine Erkenntnis aus meinen Texts, vielleicht lieg eich auch falsch)
Wenn der gesuchte String kein reiner Text ist, sondern irgend wie mit Java zusammengebastelt ist, funktioniert der Code nicht mehr.
Der Code erkennt nur Text (ASCI)
Liegt das an dieser Zeile :
objXMLHTTP.ResponseText
Gibt es vielleicht noch einen andern Parameter dafür, der ausser reinen Text auch Java erkennt ?
Falls nicht, kein Problem , ich komme auch damit klar und das Beispiel ist so schon gut.
Gruß
Jockel

Anzeige
Da wird's schwierig
20.10.2015 14:51:26
Michael
Hi Jockel,
.ResponseText gibt in der Tat den reinen Text der Seite zurück - mitsamt dem darin enthalten JS-Code, der allerdings *nicht ausgeführt* wird.
Einige weitere Möglichkeiten findest Du hier: http://www.office-loesung.de/ftopic139760_0_0_asc.php
Ich habe auch mal mit einer Website herumgespielt, die Daten teilweise als Text und teilweise über JS erzeugt hat (das waren etwa die letzten drei Stellen einer Telefonnummer) - das Problem war dann letztlich, daß die Seite beim händischen Aufruf im Browser "richtig" angezeigt wurde, beim programmierten Aufruf über das Browser-Objekt dann allerdings eine zusätzliche "Zwischenseite" angezeigt hat, die ich dann auch nicht ohne Weiteres auslesen konnte - ich hatte dann keinen Bock mehr, das zu vertiefen und einen freundlichen Helfer gebeten, die paar benötigten Daten händisch über die Zwischenablage in Textdatein zu kopieren, die ich dann anschließend ausgewertet habe.
Jeder Seitenbetreiber weiß natürlich, wie Du auf seine Infos zugreifst (insbesondere, mit welchem Browser), nachzusehen etwa bei: https://panopticlick.eff.org/
Ich weiß nicht, was für eine Kennung all die programmierbaren Objekte zurückliefern, aber wenn ein Seitenbetreiber seine Daten vor automatischem Auslesen schützen will, kann er die Anzeige bei bestimmten Kennungen locker unterdrücken.
Ist ja auch legitim, wenn er davon lebt.
Schöne Grüße,
Michael

Anzeige
DANKE : Da wird's schwierig
21.10.2015 09:24:20
jockel
Hallo Michael,
Danke noch mal. Hast mir viel weitergeholfen.
Das mit dem Java geht halt einfach nicht, fertig :-)
Komme mit Deinem Beispiel auch so voran.
Gruß
Jockel

gerne, vielen Dank für die Rückmeldung, Gruß
21.10.2015 17:23:04
Michael
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

String aus Webseite mit VBA auslesen


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor in Excel. Drücke ALT + F11.

  2. Füge ein neues Modul hinzu: Klicke im Menü auf Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Option Explicit
    
    Function GetHTTPResult(sURL As String) As String
        Dim XMLHTTP As Object
        Set XMLHTTP = CreateObject("MSXML2.XMLHTTP")
        XMLHTTP.Open "GET", sURL, False
        XMLHTTP.Send
        GetHTTPResult = XMLHTTP.ResponseText
        Set XMLHTTP = Nothing
    End Function
    
    Sub GetTextAusSite()
        Dim sURL As String, sResult As String
        Dim von As Long, bis As Long
    
        sURL = "https://wiki.selfhtml.org/"
        sResult = GetHTTPResult(sURL)
    
        von = InStr(1, sResult, "Vollständiges")
        If von > 0 Then
            bis = InStr(von, sResult, "<")
            MsgBox Mid(sResult, von, bis - von)
        Else
            MsgBox "String nicht gefunden."
        End If
    End Sub
  4. Ändere die URL in der GetTextAusSite-Sub, um die Webseite zu verwenden, die Du auslesen möchtest.

  5. Führe das Makro aus: Klicke auf Run oder drücke F5, um den Text auszulesen.


Häufige Fehler und Lösungen

  • Fehler: "Der Servername oder die Serveradresse konnte nicht verarbeitet werden."

    • Lösung: Überprüfe die URL auf Schreibfehler und stelle sicher, dass die Webseite erreichbar ist.
  • Fehler: "Das Objekt kann nicht gefunden werden."

    • Lösung: Achte darauf, dass Du die richtige Version von MSXML installiert hast. Du kannst auch MSXML2.ServerXMLHTTP anstelle von MSXML2.XMLHTTP verwenden.
  • Fehler: Der gesuchte String wird nicht gefunden.

    • Lösung: Stelle sicher, dass der String korrekt in InStr eingegeben wurde und überprüfe den HTML-Code der Webseite.

Alternative Methoden

Eine weitere Möglichkeit, Daten von einer Webseite auszulesen, ist die Verwendung von WinHttp.WinHttpRequest. Hier ist ein Beispiel:

Sub GetTextMitWinHttp()
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    http.Open "GET", "https://wiki.selfhtml.org/", False
    http.Send

    MsgBox http.ResponseText
End Sub

Praktische Beispiele

Hier ist ein einfaches Beispiel, um den Text "Vollständiges Inhaltsverzeichnis" von einer Webseite auszulesen:

Sub Beispiel()
    Dim sResult As String
    sResult = GetHTTPResult("https://wiki.selfhtml.org/")

    If InStr(sResult, "Vollständiges") > 0 Then
        MsgBox "Text gefunden!"
    Else
        MsgBox "Text nicht gefunden."
    End If
End Sub

Tipps für Profis

  • Nutze .responsetext, um den gesamten HTML-Inhalt der Webseite zu erhalten.
  • Verwende Regular Expressions in VBA, um komplexe Muster im HTML-Code zu finden.
  • Berücksichtige, dass einige Webseiten mit JavaScript Inhalte dynamisch laden. In solchen Fällen kann das einfache Auslesen des HTML-Codes nicht ausreichen.

FAQ: Häufige Fragen

1. Kann ich auch Daten von Seiten auslesen, die mit JavaScript erstellt wurden? Das Auslesen von JavaScript-generierten Inhalten ist schwierig. In der Regel wird nur der statische HTML-Code zurückgegeben. Für komplexere Webseiten könnte es notwendig sein, auf Web-Scraping-Tools oder APIs zurückzugreifen.

2. Funktioniert dieser Code in jeder Excel-Version? Der vorgestellte Code sollte in Excel 2007 und höher funktionieren. Bei älteren Versionen kann es zu Komplikationen kommen, insbesondere bei der Verwendung von MSXML.

3. Gibt es eine Möglichkeit, die Abfrage zu automatisieren? Ja, Du kannst das Makro so einstellen, dass es regelmäßig ausgeführt wird, indem Du es in ein Workbook_Open-Ereignis oder einen Timer einfügst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige