2017-10-31 2 views
1

Erstens bin ich sehr neu mit VBA und habe nur soweit ich bin mit Lösungen aus anderen Fragen online gestellt. Was ich habe, ist ein Makro, das IE zu einer spezifizierten URL öffnet, Text in eine Suche eingibt, die Ergebnisse lädt und dann die Suche durch spezifischere Suchwerte durchläuft.Abrufen von Website-Daten Excel VBA

Was ich versuche zu tun ist, die Ergebnisse einer Suche in Excel zu kratzen. Die Ergebnisse erscheinen jedoch nicht im resultierenden HTML-Code, sondern scheinen von einem Skript auf der Website generiert zu werden.

Ein Beispiel für die Seite Ich suche: https://www.gamestop.com/PickUpAtStore/75083/0/917850

Bei Belastung werden die Ergebnisse auf der Seite, aber nicht auf der Seite Quelle. Mit Blick auf die Seite Quelle es ein Skript zu sein sucht, die die Ergebnisse in zieht:

<script id="stores" type="text/x-handlebars-template"> 
{{#if this}} 
<ul> 
    {{#each this}} 
    <li id="{{StoreNumber}}|{{#if true}}917850 {{/if}}" class="{{#if false}}checkOnly{{/if}}""> 

     <div class="fluidWrapper ats-storelist" id="{{StoreNumber}}"> 
      <div class="contactInfo"> 
       <div class="title ats-storetitle">{{DisplayName}}</div> 
       <div class="address ats-storeaddress"> 
        {{{AddressStreet}}}<br />{{AddressCityStateZip}} 
       </div> 
       <div class="phoneNumber ats-storephone"> 
        {{Phone}} 
       </div> 
      </div> 
      <div class="rightInfo"> 
       <div class="distance ats-storedistance">{{Distance}} {{#if true}}<i id="showHoldOptions_{{StoreNumber}}" class="{{#if false}} plus_{{/if}}icon"></i>{{/if}}</div> 
      </div> 
     </div> 
.................. 

Idealer geladen werden, um den Shop-Namen sind, was ich möchte geschehen ist, wenn die Ergebnisse, Adresse und Telefon # setzen in Excel Beginnen Sie bei A4, B4, C4 und fügen Sie jeden Speicher zur nächsten Zeile hinzu.

Sehe ich an dem völlig falschen Ort, um diese Ergebnisse zu greifen? Ich schätze jede Hilfe, die das löst.

bearbeiten aktuelle Makro hinzufügen:

Sub Search_Cell() 

Dim ie As Object 
Dim lRow As Long 
Dim URL As Range 

Set ie = CreateObject("InternetExplorer.Application") 
ie.Visible = True 

For Each URL In Range("B1") 
ie.navigate URL.Value 
Application.StatusBar = "Submitting" 
While ie.Busy 
    DoEvents 
Wend 
Next 

For lRow = 1 To 89 

With ie.document 
.all("puas_search").Value = Sheets("Zipcodes").Range("A" & lRow).Value 
.getElementById("puas_search").Focus 
End With 

Application.SendKeys ("~") 
Application.Wait Now + #12:00:02 AM# 'wait 2 seconds 

    ' Get results of search 

    ' Add Store name to A4, Address to B4, Phone# to C4 (but for following searches start at the next empty row) 

    ' Add following results to next row 


Next lRow 'loop to next search 


ie.Quit 
Set ie = Nothing 

MsgBox "Done" 

End Sub 
+0

Wie sieht Ihr bestehender Code gerade aus? Ich [habe kürzlich eine sehr ähnliche Frage beantwortet] (https://stackoverflow.com/a/47040459/8535397). Unter Verwendung des IE-Objekts sollte es in der Lage sein, das erzeugte HTML zu lesen (ohne sich um die Quelle zu kümmern). – Tigregalis

+0

@Tigregalis Mit der HTML-Verschrottung ruft das OP nur '{AddressStreet}' ab und er will den Wert, der von ihm angegeben wird und nicht {AddressStreet}. Ich denke, es ist nicht möglich, diese Daten mit nur HTML-Verschrottung zu erhalten. – danieltakeshi

+1

@danieltakeshi es ist nicht HTML-Scraping, es ist DOM Traversal. Ich sagte "generated HTML", aber was ich wirklich meinte, war das DOM. Das IE-Objekt lässt uns die DOM-Hölle durchqueren, wenn wir es wollten, könnten wir es verwenden, um Formular-Eingaben zu automatisieren. – Tigregalis

Antwort

0

ich dieses Problem gelöst, ich war völlig falsch zu denken, dass die Ergebnisse nicht von der html gekratzt werden konnte. Vielen Dank @Tigregalis für mich in die richtige Richtung zu stoßen.

Hier ist der Code-Schnipsel, der die Daten, die ich brauche, an die richtige Stelle in Excel zieht und dann in die nächste Zeile verschiebt.

Set HTMLDoc = IE.document 

    Set Stores = HTMLDoc.getElementsByClassName("contactInfo") 

    For Each Store In Stores 
     ColNum = 1 

     For Each Name In Store.Children 

      Cells(RowNum, ColNum) = Name.innerText 
      ColNum = ColNum + 1 

     Next Name 
     RowNum = RowNum + 1 

    Next Store