VBA: Hyperlink von Webseite in Zelle einfügen

Moderator: ModerationP

VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 17. Apr 2019, 14:48

Hallo liebe Leute,

folgende Herausforderung: Ich möchte gerne, dass Excel mir einen Hyperlink, zu einem Bild von einer Webseite in eine entsprechende Zelle schreibt.
Ich bin so weit gekommen, dass Excel die richtige Webseite aufmacht und den Webseitencode habe ich ebenfalls bereits als object definiert.

Aber wie komme ich jetzt weiter?

Hier der Code den ich bisher zustande gebracht habe (+ Beispielwebseite: buecher.de)

Code: Alles auswählen
Public Sub Test()
    Call public_work.work
    Dim objIEDoc As Object
    Dim lngLastRow As Long
    Dim strURL As String
    Dim objIE As Object
    Dim x As Long
    Application.ScreenUpdating = False
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True 'später umstellen
    x = 4
        strURL = "https://www.buecher.de/shop/buecher-von-s-nordqvist/spaziergang-mit-hund/nordqvist-sven/products_products/detail/prod_id/54217908/"
        With objIE
            .Navigate strURL
            Sleep 500
            Do: Loop Until .Busy = False
            Do: Loop Until .Busy = False
            Set objIEDoc = .Document
        End With
        With objIEDoc
'...

Hier möchte ich jetzt gerne den Hyperlink des Covers in eine Zelle schreiben lassen.
Im Webbrowser an sich finde ich die URL zu dem Bild auch, aber wie bringe ich Excel bei genau diese URL zu nehmen und in die Zelle zu schreiben?

Alle Hilfen sind wie immer sehr willkommen!
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon snb » 17. Apr 2019, 17:39

Code: Alles auswählen
Sub M_snb()
   Sheet1.Shapes.AddPicture "https://bilder.buecher.de/produkte/54/54217/54217908z.jpg", True, False, Cells(30, 5).Left, Cells(30, 2).Top, 100, 100
End Sub
snb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6804
Registriert: 25. Sep 2014, 16:37

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 26. Apr 2019, 09:26

Hallo snb,

da ich letzte Woche weit weg von jeglichen Computern war, komme ich erst jetzt auf dieses Topic zurück.
Schon einmal ein großes Danke an Dich.

Du hast meine unausweichliche nächste Frage gleich schon einmal beantwortet. Die Bilder gleich mit einzufügen ist gleich noch ein Level besser als ich angedacht habe.

Jedoch hat sich mein eigentliches Problem noch nicht ganz geklärt. Ich habe jetzt eine andere Seite als "Quellseite" für die Bilder, die ich einfügen möchte: thalia.de, da die Suche sich dort etwas anders gestaltet und so die Programmierung einfacher ist.
Da ich mehrere verschiedene Bilder suche bräuchte ich entsprechend die Möglichkeit im Quelltext der Webseite nach dem Bild zu suchen.
D.h. ich wäre jetzt auf dieser Webseite um das Beispiel forzuführen:
https://www.thalia.de/suche?filterPATHROOT=&sq=9783789110603

Auf der Webseite ist das Cover/Bild nun erst einmal angezeigt. Ich würde jetzt gerne irgendwie erreichen, dass das ich per Skript den Link zu dem Cover herausbekomme, und diesen dann in die entsprechende Zelle schreibe. Ok das schreiben des Links in die Zelle ist einfach, aber wie kann ich mit Hilfe von VBA auf der Webseite den Link suchen und kopieren (zu dem Bild selbstverständlich).


Vielen Dank für Eure Hilfe und Mühen! :)

Edit 1:
Wenn ich im Quelltext der Seite nach "assets.thalia.media/img/*.jpg" suchen könnte würde ich entsprechend den link auch sehr schnell finden.
Das wäre dann in Zeile 4105 (Chrome als Browser).

Edit 2:
Hier ist ein Beispiel für einen Code, den ich im Internet gefunden habe, der nach etwas im Quelltext der Seite sucht:
Code: Alles auswählen
 With objIEDoc
'            Do
'            Loop Until .ReadyState <> 4
'            If Not .images.Length = 0 Then
'                For lngTMP = 0 To .images.Length - 1
'                    If LCase(.images(lngTMP).nameprop) Like _
'                        "*logo*" Then
'                        Tabelle1.Hyperlinks.Add _
'                            Anchor:=Tabelle1.Cells(lngRow, 3), _
'                            Address:=.images(lngTMP).src
'                        lngRow = lngRow + 1
'                        Exit For
'                    Else
'                        If lngTMP = .images.Length - 1 Then
'                            Tabelle1.Cells(lngRow, 3).Value = _
'                                "Kein Logo!"
'                            lngRow = lngRow + 1
'                        End If
'                    End If
'                Next lngTMP
'            Else
'                Tabelle1.Cells(lngRow, 3).Value = "Kein Logo!"
'                lngRow = lngRow + 1
'            End If
'        End With


Leider verstehe ich den Code nur zur Hälfte, sodass ich diesen nicht entsprechend meiner Wünsche anpassen kann.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 26. Apr 2019, 10:10

So nachdem ich mich jetzt ein wenig mit dem Code auseinander gesetzt habe, verstehe ich diesen so richtig?

Das Skript sucht sich alle Bilder der Seite raus, bzw schaut wie viele auf der Seite existiert und geht diese dann der Reihe nach durch? (Ich habe von HTML noch weniger eine Idee als von VBA :D )
Die Bilder scheinen das Atribut "scr" in HTML zu tragen!?

Das Skript sucht dann nach dem Namen der mit "like" angegeben wird. Wenn gefunden, dann schreibt das Skript die URL als Hyperlink an die angegebene Stelle.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon Zwenn » 26. Apr 2019, 10:50

Hallo turbosoeckchen,

ich möchte zu Deinem Thema mal ganz allgemein antworten. Im Kern ist es so, dass der Zugriff auf Webseiten über ein Makro für jede Webseite individuell programmiert werden muss. Deshalb nutzt es gar nix, wenn Du erst eine und dann eine zweite Beispielseite angibst. Es wäre viel hilfreicher, wenn Du mal Dein eigentliches Projekt beschreibst und auf welche Seiten Du dann wirklich zugreifen willst um Dein Ziel zu erreichen. Was Du schreibst ist viel zu allgemein gehalten. Ich mache das mal an Deinem Thalia-Beispiel fest.

  • Du hast einen Link auf ein Suchergebnis gegeben, der genau einen Suchtreffer ausweist. Wenn ich oben Stephen King eingebe, bekomme ich aber viele Suchtreffer und dem entsprechend auch viele mögliche Bilder angezeigt.
  • Man kann beliebig viele Bilder auslesen. Problem speziell auf der Thalia-Seite ist aber, dass man nicht durch die Suchergebnisse blättert, indem man unten auf die nächste Suchseite klickt, wie z.B. auf Amazon. Thalia löst das über AJAX. Das bedeutet, weitere Inhalte werden dynamisch nachgeladen. In diesem Fall indem weiter nach unten gescrollt wird, wie z.B. auf Facebook. Anders als auf Facebook, werden aber nicht beliebig viele Inhalte nachgeladen, sondern es taucht dann doch ein Button auf Weitere Treffer laden.
  • Wenn Du nun sagst, Du hast eine Liste von Artikelnummern oder ISBN entfällt das im vorherigen Punkt beschriebene Problem, aber das Ganze wird relativ unflexibel. In einer Schleife könntest Du immer bis zu 12 Ergebnisse holen, wenn ich richtig gezählt habe. Wenn Du mehr brauchst, musst Du rausfinden, wie Du mehr Ergebnisse anzeigen kannst.
  • Die einzelnen HTML Abschnitte für Suchtreffer sind DIV-Tags mit der CSS-Klasse class="row product". Die kannst Du mit getElementsByClassName("row product") in einer sogenannten Node-Collection einsammeln. Das ist der Punkt, an dem ich Dich auf die grundlegende Technik, bzw. Schnittstelle hinweise, mit der man individuell auf Inhalte von Webseiten zugreifen kann: Das DOM (Document Object Model). Das kannst Du recherchieren und dazu auch den Suchbegriff Web Scraping verwenden. In der Regel kommt man mit den get-Methoden schon sehr weit. Sobald JavaScript ins Spiel kommt kann es eklig werden. Die get-Methoden sind getElementsByTagName(), getElementsByClassName, getElementByID() und getAttribute(). Auf Attribute kann man nur zugreifen, wenn man schon eine Node-Collection mit einer der anderen Methoden erstellt hat. Du wirst auch noch getelementsByName() finden, das ist allerdings outdated, wie es so schön heißt (also veraltet) und wird nicht mehr unterstützt.
  • Nun kannst Du aus den einzelenen HTML-Abschnitten die IMG-Tags rausholen und die Links zu den Bildern auslesen. Thalia stellt Bilder in unterschiedlichen Auflösungen zur Verfügung. Ein Bilderlink endet vor dem .jpg immer auf eine Zahlenfolge wie 00-08 oder 00-03 oder sowas. Wenn Du diese durch 00-00 ersetzt, bekommst Du immer das Bild in der höchsten Auflösung. Ob Du das willst musst Du selber entscheiden. Mir ist nur aufgefallen, dass teilweise recht kleine Bilder angezeigt werden, wenn man die Links mal in den Browser eingibt. Du kannst damit rumspielen, indem Du einfach mal die letzte Ziffer änderst. Dann siehst Du unterschiedliche Größen des selben Bildes. Das größte gibt es wie gesagt mit 00-00, soweit ich es geprüft habe.

Das was ich direkt zur Seite beschrieben habe, gilt ausschließlich für die Thalia-Seite. Für eine andere Seite sieht die Erkennung der betreffenden HTML-Abschnitte anders aus und ob Bilder in unterschiedlichen Auflösungen abgelegt wurden kann man vorher auch nicht wissen (Amazon und Ebay machen das auch, allerdings jeweils mit einem anderen System) Das was für alle Seiten funktioniert ist das DOM. Darin ist die Struktur der Seite hinterlegt und darüber kannst Du individuell auf Seiteninhalte zugreifen. Das Dumme ist, das lernt man nicht an einem Nachmittag und auch die Programmierung eines Makros für eine spezielle Aufgabe kann zeitintensiv sein. Deshalb komme ich auf meinen Anfang zurück: Du musst genau beschreiben was Du vor hast. Was ist Deine Ausgangssituation, was ist Dein Ziel?

Viele Grüße,

Zwenn
Zwenn
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 32
Registriert: 16. Mär 2019, 11:18

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 26. Apr 2019, 11:03

Hallo Zwenn,

vielen Dank für deine ausführliche Antwort. Ich werde mich da auf jeden Fall einlesen, schon aus ganz eigenem Interesse :) .

Ich habe mich jetzt auf die Thalia-Webseite festgelegt, da hier die Suche nach EANs/GTINs sehr einfach ist. Es gibt einen Link für die Suche, entsprechend muss lediglich die EAN in der Suche angepasst werden.
Die Probleme, die Du beschreibst, werden nicht auftreten, da ich glücklicherweise die EANs zur Verfügung habe (in einer Liste), also immer nur genau einer Treffer (oder eben kein Treffer) auftreten wird.

Ich werde jetzt mit Deinen Hinweisen weiter arbeiten, und schauen wie weit ich komme.
Da ich Neuling bin, muss ich mir fast alles erst selbst erarbeiten, was anstrengend aber auch für mich spaßig ist.

Viele Grüße
die socke


Nachtrag 1:
Da ich genau immer nur einen Eintrag für die Klasse haben werde (oder entsprechend keinen Eintrag), macht es dann trotzdem Sinn mit einer Collection zu arbeiten?
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 26. Apr 2019, 12:27

So ich bin jetzt weiter gekommen:
Ich habe mir einfach "row product" als neues object erstellt.

Mir stellt sich nun gerade lediglich die Frage, wie ich aus diesem Object die URL auslesen kann, bzw. die Zahl, die sich je nach Produkt ändert.
Wenn ich das jetzt richtig gesehen habe, brauche ich garnicht die URL, sondern lediglich die scheinbar interne thalia.de ID des Produktes.

Liebe Grüße
Zuletzt geändert von turbosoeckchen am 26. Apr 2019, 12:56, insgesamt 1-mal geändert.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon Zwenn » 26. Apr 2019, 12:42

Hallo turbosoeckchen,

Du musst ja irgendwie an die richtige Stelle im HTML-Quellcode der Seite kommen. Die get-Methoden erledigen also zwei Dinge für Dich. Zum einen identifizieren sie die gesuchten HTML-Abschnitte und zum anderen stellen sie Dir genau diese zur weiteren Verarbeitung zur Verfügung. Wie willst Du denn die Identifikation anders vornehmen? Da bliebe das Parsen des HTML-Quelltextes mit String-Operationen. Aber damit gibt man sofort die Möglichkeiten auf, die einem das DOM bietet. Außerdem wird das beliebig kompliziert und ist halt völlig überflüssig. Also ist es egal, ob in einer Node-Collection 0, 1 oder 1.000 Elemente versammelt werden. Du kannst Dich darauf verlassen, dass die Seite genau diese Anzahl von entsprechenden Elementen enthält.

Deine Frage lässt sich auch beantworten, indem man auf die Unterschiede von getElementByID() und den beiden get-Methoden für TagName und ClassName eingeht. Wenn Du genau hinschaust, siehst Du, dass es für die ID-Methode heißt getElement während es bei den anderen beiden Methoden getElements ist, also auf s endet. Zu einer ID gibt es nämlich nur ein einziges Element in der aufgerufenen Seite, sofern die Standards eingehalten wurden. Ein Tag- oder Class-Name kann hingegen beliebig oft auftreten.

Die get-Methoden sind übrigens Methoden des document-Objektes, welches wiederum ein Objekt des Browser-Objektes ist. Die gebildete Node-Collection ist dann wieder ein eigenes Objekt. Der Aufruf funktioniert also nach diesem Schema:
Code: Alles auswählen
set knoten = browser.document.getElementsByClassName("row product")


Die Elemente einer Collection haben Indizes ab 0, können also wie ein Element in einem Array angesprochen werden. Folgendermaßen kann man also auf das erste Element der Collection zugreifen:
Code: Alles auswählen
Set unterKnoten = knoten(0)


Da Du immer nur auf das erste Element zugreifen willst, kannst Du das allerdings in einer Zeile machen:
Code: Alles auswählen
set knoten = browser.document.getElementsByClassName("row product")(0)


Um zu prüfen, ob eine Collection gebildet werden konnte, musst Du unbedingt eine Prüfung vornehmen, um Laufzeitfehler zu vermeiden, wenn sie nicht gebildet werden konnte, weil es keinen Suchtreffer gab. Das machst Du, indem Du abfragst, ob das Objekt (hier knoten) nicht nichts ist. Das mutet komisch an, weil es eine doppelte Verneinung ist. Aber wenn ein Objekt nicht vorhanden ist, dann ist das durch das Schlüsselwort Nothing festgelegt. Wir wollen aber nicht wissen, ob ein Objekt nicht vorhanden ist, sondern ob es vorhanden ist. Also wird Nothing mit dem logischen Operator Not abgefragt:
Code: Alles auswählen
If Not knoten is Nothing then
  ... mach hier was mit der Collection
End If


Ich habe leider keine Zeit da jetzt weiter drauf einzugehen, aber vielleicht hilft Dir das schonmal weiter.

Viele Grüße,

Zwenn

PS: Ich sehe grade, dass Du noch etwas geschrieben hast. Poste doch mal den Code, den Du bisher hast.
Zwenn
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 32
Registriert: 16. Mär 2019, 11:18

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 26. Apr 2019, 13:03

Vielen lieben Dank schon Einmal.
Was ich jetzt gemacht hatte, ist das Folgende:
Code: Alles auswählen
      With objIEDoc
            Set cover = .getElementsByClassName("row product")
            If Not cover Is Nothing Then
                das.Cells(x, 3).Value = ***
            Else
                das.Cells(x, 3).Value = "Kein Cover"
            End If
            Set cover = Nothing
        End With

Jetzt stellt sich nur die Frage für mich noch, wie ich in dem Object nach der URL, bzw. der thalia internen ID komme. (Als Beispiel: view-source:https://www.thalia.de/suche?filterPATHROOT=&sq=9783651025585 Zeile 4091).
Denn diese möchte ich gerne in einer entsprechende Zeile zurückgeben lassen.

Im Endeffekt reicht hier die ID vollkommen aus, da alle BildURLs entsprechend uniform mit dieser ID aufgebaut sind.

Edit 1:
Cover habe ich als allgemeines object definiert. Leider kann ich mit Anweisungen "innerText", oder "outerText" nicht auf die entsprechenden Werte zurückgreifen die dort hinterlegt sind. Hier wirft mir Excel immer nur den Fehler aus, dass diese Anweisung nicht mit dem Object möglich ist, bzw. nicht definiert ist.


Edit 2:
Die ID wird in HTML scheinbar als itemprop="sku" definiert, sollte diese dann nicht auf in dem Object findbar sein?

Edit 3:
Die Klasse "abs lads" verweist genau auf diese ID, die ich brauche. Diese Klasse sollte ebenfalls einmalig auftreten, im Fall, dass nur ein Treffer existiert.
Wenn ich die Klasse "abs lads" als object definiere, finde ich in dieser 8 Items. Im ersten Item (Item 1) würde ich unter dem Punkt "nameProp" die ID des Artikels finden, die ich nutzen möchte.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 26. Apr 2019, 14:09

So jetzt lieber einen Doppelpost:
Ich habe jetzt endlich verstanden, dass
Code: Alles auswählen
 Set cover = .getElementsByClassName("row product")
, mir eine collection von Knoten wiedergibt :)
Da ich immer nur auf den ersten zugreifen möchte wäre entsprechend
Code: Alles auswählen
Set cover = .getElementsByClassName("row product")(0)
die bessere Wahl.

Mir bleibt jetzt nur noch die Frage bestehen, wie ich den Wert der Variablen nameProp in die entprechende Zelle bekomme. Scheinbar bekomme ich die Syntax nicht hin, da das Object meine Methode nicht unterstützt.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon Zwenn » 26. Apr 2019, 14:36

Hallo turbosoeckchen,

wie ich sehe bist Du voll dabei. Das freut mich :-)

Du musst Dir vor Augen führen, was in einem Element einer Collection landet. Du bildest eine Collection auf alle Tags mit dem CSS-Klassennamen row product. In einem Element landet dann ALLES, was in so einem Tag steht, bis er geschlossen wird. Das bedeutet, der hier speziell betrachete und in der Collection befindliche Knoten zu Deiner Beispiel-URL enthält folgenden HTML-Code:
Code: Alles auswählen
<div class="row product" itemprop="itemListElement" itemscope itemtype="http://schema.org/Product">
  <meta itemprop="gtin13" content="9783789110603" />
  <meta itemprop="sku" content="139844041" />
  <meta itemprop="position" content="0" />
  <div class="small-4 medium-3 columns text-right">
    <div class="rel">
      <a href="/shop/home/artikeldetails/ID139844041.html"
         title="Spaziergang mit Hund"
         class="lads"
         data-id="139844041"
         data-preis="20.00"
         data-preis-reduziert="false"
         data-alterpreis=""
         data-position="0"
         data-info="product"
        <span class="oProductCover oProductCover08">
          <noscript>
            <img src="https://assets.thalia.media/img/139844041-00-08.jpg"
                 data-interchange="[https://assets.thalia.media/img/139844041-00-00.jpg, (retina)]"
                 title="Spaziergang mit Hund"
                 alt="Spaziergang mit Hund"
                 width="155"
                 height="127"
            >
          </noscript>
          <meta itemprop="image" content="https://assets.thalia.media/img/139844041-00-08.jpg">
          <img data-lazy-load src="https://assets.thalia.media/base/static-template-images/empty.gif"
               data-src="https://assets.thalia.media/img/139844041-00-08.jpg"
               data-interchange="[https://assets.thalia.media/img/139844041-00-00.jpg, (retina)]"
               title="Spaziergang mit Hund"
               alt="Spaziergang mit Hund"
               width="155"
               height="127"
          >
        </span>
      </a>
    </div>
  </div>
  <div class="small-8 columns end">
    <a itemprop="url"
       href="/shop/home/artikeldetails/ID139844041.html"
       data-test="detailsArtikelLink139844041"
       class="clickable lads"
       title="Spaziergang mit Hund"
       data-id="139844041"
       data-preis="20.00"
       data-preis-reduziert="false"
       data-alterpreis=""
       data-position="0"
       data-info="product">
      <h2 class="ncTitle">
        <span class="oProductTitle" itemprop="name">
          Spaziergang mit Hund
        </span>
      </h2>
    </a>
    <div>
      <div class="ncAuthor">
        von
        <span class="masked-link"
              data-masked-href="L3Nob3AvaG9tZS9tZWhyLXZvbi1zdWNoZS9BTlkvc3Avc3Zlbl9ub3JkcXZpc3QuaHRtbD9tZWhyVm9uPVN2ZW4lMjBOb3JkcXZpc3Q="
              data-info="suche-autor">
          <span class="oAuthor">
            Sven Nordqvist
          </span>
        </span>
      </div>
      <div class="show-for-medium ncAuthor">
        <span>
          Erschienen 21.01.2019
        </span>
      </div>
    </div>
    <div class="oRating" data-test="bewertungArtikel">
      <span class="active rating-star">
      </span>
      <span class="active rating-star">
      </span>
      <span class="active rating-star">
      </span>
      <span class="active rating-star">
      </span>
      <span class="active rating-star">
      </span>
      <span class="fontLight otRatingsNumber">
        (
        <span>
          4
        </span>)
        )
      </span>
    </div>
    <div class="row clickable ncMainFormat">
      <div class="medium-8 small-12 columns">
        <div class="ncCategory">
          <div class="ncCategory">
            <span class="noCategory">
              Buch (gebundene Ausgabe)
            </span>
          </div>
          <div class="sbe-club-info show-for-medium">
          </div>
          <div class="shipping show-for-medium">
            <span class="deliveryTime" data-test="meldetextArtikel">
              Sofort lieferbar
            </span>
            <span class="deliveryFree">
              Versandkostenfrei
            </span>
          </div>
        </div>
      </div>
      <div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="medium-4 small-12 columns ncPrice medium-text-right">
        <div>
          <span class="mainPrice">
            <span class="oPrice" data-test="preisArtikel139844041">
              <span class="oPriceLeft">
                20
              </span>
              <span class="oPriceSeparator">
                ,
              </span>
              <span class="oPriceRight">
                00
              </span>
              <span class="oPriceSymbol oPriceSymbolRight">
                &euro;
              </span>
            </span>
          </span>
          <meta itemprop="priceCurrency" content="EUR" />
          <meta itemprop="price" content="20.00" />
          <a href="/shop/home/artikeldetails/ID139844041.html"
             class="abs lads"
             data-id="139844041"
             data-test="preisArtikel139844041"
             title="Spaziergang mit Hund"
             data-preis="20.00"
             data-preis-reduziert="false"
             data-alterpreis=""
             data-position="0"
             data-info="product">
          </a>
        </div>
      </div>
    </div>
    <div class="show-for-small-only">
      <div class="sbe-club-info">
      </div>
      <div class="shipping">
        <span class="deliveryTime" data-test="meldetextArtikel">
          Sofort lieferbar
        </span>
        <span class="deliveryFree">
          Versandkostenfrei
        </span>
      </div>
    </div>
  </div>
</div>


Auf diesem arbeitest Du weiter. Es ist wieder ein DOM-Objekt. nur dass es in einer eigenen Objekt-Variable gespeichert wurde. Insgesamt kommst Du so an Deine gesuchten Werte:
Code: Alles auswählen
Sub tahliaAuslesen()

Dim browser As Object
Dim teilURL As String
Dim url As String
Dim knotenSuchTreffer As Object
Dim knotenBildURL As Object
Dim knotenThaliaNr As Object
Dim knotenMetaTags As Object

'Text-Ergebnisse
Dim bildURL As String
Dim thaliaNummer As String

  'Hier nur eine Nummer als dynamischer URL-Teil
  'In der Praxis wird dann vermutlich mit einer
  'Schleife durch eine Tabelle gegangen
  teilURL = "9783789110603"
  url = "https://www.thalia.de/suche?filterPATHROOT=&sq=" & teilURL
 
  'Seite im IE öffnen
  Set browser = CreateObject("internetexplorer.application")
  browser.Visible = False
  browser.Navigate url
  Do Until browser.ReadyState = 4: DoEvents: Loop
 
  'Den ersten Suchtreffer auslesen
  Set knotenSuchTreffer = browser.document.getElementsByClassName("row product")(0)
 
  If Not knotenSuchTreffer Is Nothing Then
    'Wenn es einen Suchtreffer gab
    '
    'Eine Node-Collection der img-Tags bilden und direkt
    'auf das erste Element zugreifen
    Set knotenBildURL = knotenSuchTreffer.getElementsByTagName("img")(0)
   
    If Not knotenBildURL Is Nothing Then
      bildURL = knotenBildURL.src
    End If
    '
    'Eine Node-Collection der meta-Tags bilden,
    'denn in einem ist die Thalia-Nummer
    Set knotenMetaTags = knotenSuchTreffer.getElementsByTagName("meta")
   
    If Not knotenMetaTags Is Nothing Then
      'Alle Meta-Tags durchgehen und auf das Attribut itemprop mit
      'dem Wert sku prüfen
      For Each knotenThaliaNr In knotenMetaTags
        If knotenThaliaNr.getAttribute("itemprop") = "sku" Then
          'Das richtige Meta-Tag wurde gefunden
          'Nun auf das richtige Attribut content zugreifen
          'und seinen Wert speichern. Denn der ist die
          'gesuchte Thalia-Nummer
          thaliaNummer = knotenThaliaNr.getAttribute("content")
         
          'Die Thalia Nummer wurde gefunden
          'also Schleife verlassen
          Exit For
        End If
      Next knotenThaliaNr
    End If
   
    MsgBox "Bild URL: " & bildURL & Chr(13) & "Thalia-Nummer: " & thaliaNummer
  End If
 
  'Aufräumen
  browser.Quit
  Set browser = Nothing
  Set knotenSuchTreffer = Nothing
  Set knotenBildURL = Nothing
  Set knotenThaliaNr = Nothing
  Set knotenMetaTags = Nothing
End Sub


Ich habe Dir da mal direkt mit reingebaut, wie man an Attributwerte kommt. Das ist nämlich mitunter eine extrem gute Quelle, um Informationen abzugreifen. So auch hier.

Du konntest in Deinem vorletzten Posting nicht auf innertext zugreifen, weil Du auf die gesamte Collection zugegriffen hast. Aber du musst natürlich auf ein einzelnes Element zugreifen, also über den Index oder innerhalb einer For-Each-Schleife. Auch, wenn es nur ein Element gibt. Das kannst Du analog zu einem Array sehen. Da reicht ja auch nicht der Array-Name, sondern Du musst über den Index gehen, um an die Inhalte zu kommen.

Viele Grüße,

Zwenn
Zwenn
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 32
Registriert: 16. Mär 2019, 11:18

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon turbosoeckchen » 27. Apr 2019, 13:36

Vielen lieben Dank Zwenn!

Also wenn ich das jetzt richtig sehe, wird der Quelltext je nach dem was gesucht wird, immer weiter runtergebrochen auf die richtige Stelle, indem bestimmte Bereiche des Textes als ein neues Object definiert wird.
In den Objekten kann dann wieder weiter gesucht werden, z.B. nach Attributen.
Ich hatte die ID, um die es mir primär geht jetzt ebefalls in einer weiteren einzigartigen Klasse gefunden, wie oben schon angedeutet und diese nun auch bereits aus dem Objekt in die richtige Zelle schreiben lassen.

Ich werde mich aber weiter damit beschäftigen, um den code effektiv und schlank zu halten.

Jetzt verstehe ich wie viele der Sachen gemacht werden.

Noch einmal herzlichen Dank.
turbosoeckchen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 45
Registriert: 09. Mär 2019, 19:21

Re: VBA: Hyperlink von Webseite in Zelle einfügen

Beitragvon Zwenn » 27. Apr 2019, 14:32

Hallo turbosoeckchen,

genau so ist es. Man zerlegt den HTML-Quelltext systematisch in solche Abschnitte, die einem helfen am Ende an die gewünschten Werte zu kommen. Man könnte ja z.B. auch als erstes einfach alle img-Tags einsammeln. Da ist mit Sicherheit auch das dabei, das Du möchtest. Aber wie soll man es identifizieren? Also geht man den Zwischenschritt genau dieses img-Tag in einem möglichst engen, aber auf jeden Fall vorhandenen Ausschnitt zu isolieren. Wenn man dann alle img-Tags aus diesem Abschnitt holt, weiß man, dass es das richtige ist. Auf den meisten Seiten, die man auslesen möchte, gibt es ein bestimmtes Grundmuster, das einem auch mehrere Abschnitte auf einmal zur Verfügung stellt.

In Online-Shops gibt es immer einen Container, in dem alle Suchergebnisse aufgeführt sind. Es muss nicht in jedem Suchergebnis das gleiche drin stehen (siehe Ebay-Beispiel unten), aber man kann sich darauf verlassen, dass alle Suchtreffer auf die gleiche Weise im HTML-Quellcode zu erkennen und so zu vereinzeln sind. In Foren ist es genauso und auf Seiten für Börsenkurse ebenfalls.

Dazu kannst Du Dir mal den folgenden Thread anschauen. In dem Fall gab es für die gesuchten Werte keine Attribute oder Klassen, sondern nur die Tags selbst. Aber auch die konnte man so eingrenzen, dass nur diese am Ende übrig blieben:
http://www.herber.de/cgi-bin/callthread.pl?index=1593619

Ein Projekt neueren Datums ist das Auslesen der ersten Suchseite von Ebay. Das ist einigermaßen komplex, aber wenn Du magst, kannst Du daraus sicher einiges lernen:
http://www.herber.de/cgi-bin/callthread.pl?index=1678466

Viele Grüße,

Zwenn
Zwenn
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 32
Registriert: 16. Mär 2019, 11:18


Zurück zu Excel Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: Goldi01 und 22 Gäste