Aus Exceltabelle Daten kopieren, in I-Seite suchen und Preise in Excel zurückscheiben

  • Hi Leute,

    Ich suche eine Möglichkeit Daten aus einer Exceltabelle herauszukopieren, dann nach diesem String auf einer bestimmten Internetseite suchen und die dazugehörigen Preise wieder in die selbe Exceltabelle daneben zu schreiben.

    Geht soetwas überhaupt, oder ist das zu speziell?

    Hintergrund ist, dass ich mir einen neuen Rechner zusammenstellen möchte und sich die Preise auf der Internetseite von Tag zu Tag ändern.
    Jetzt habe ich mir eine bestimmte Preisgrenze gesetzt und nun möchte ich wissen, wann meine Zusammenstellung in dem Preisrahmen liegt.

    Die Website um die es geht lautet:http://www.geizhals.at/deutschland</a> Es ist eine Preisvergleich-Seite.

    Danke schonmal für Eure Antworten und Vorschläge.

    Gruß, Hexpirator

    Einmal editiert, zuletzt von hexpirator (21. November 2011 um 12:45)

  • Sollte alles machbar sein.
    Schau dir die Excel UDF an und entweder InetGet oder WinHttp.

    [autoit]

    #include <Excel.au3>

    [/autoit][autoit][/autoit][autoit]

    $oExcel = _ExcelBookOpen($Dateipfad)
    For $i = 1 To 10 ; ich gehe jetzt mal von 10 Sachen aus
    $Cell = _ExcelReadCell($oExcel, $i, 1) ; erste Spalte in der Exceltabelle
    $Read = Inetget("Der Link mit Suchstring, wonach gesucht werden soll")
    $Read = BinaryToString($Read) ; gibt den HTML Quellcode der Suchseite aus
    ;-------------------------
    ;Hier der Code, um den Preis auf der Seite rauszusuchen
    $Value = "10"
    ;-------------------------
    _ExcelWriteCell($oExcel, $Value, $i, 2) ; schreibt den Preis in die 2 Spalte der Exceldatei
    Next

    [/autoit]
  • Hallo TheLuBu

    Danke für die schnelle Antwort.

    Was ich nicht verstehe ist diese Zeile:

    [autoit]

    $Read = BinaryToString($Read) ; gibt den HTML Quellcode der Suchseite aus

    [/autoit]

    Gibt sie den gesamten Quellcode der Seite zurück?

    Gruß.

  • Ja, den kompletten der ausgewählten Seite.
    Man kann nicht nur einen Teil einer internetseite auslesen, da die erst komplett geladen wird.
    Du musst halt mit

    [autoit]

    _Stringbetween
    Stringinstr
    Stringtrimleft & Stringtrimright

    [/autoit]


    arbeiten, um an den Preis zu kommen

  • [autoit]

    IsInt ($variable) ; Ganzzahl
    IsFloat ($variable) ;Gleitkommazhal
    IsNumber($variable ) ; Oberen Beiden zusammen
    ;Wenn beides fehlschlägt, ist mindestens ein Buchstabe drin ;)

    [/autoit]

    In dem zusammenhang evtl. noch

    [autoit]

    StringStripWS

    [/autoit]

    , um leerzeichen und Zeilenumbrüche zu entfernen

  • Wow du bist einfach nur KLASSE!!!

    Danke für die Hilfe. Bin mal gespannt ob ich das auf die Reihe kriege.

    Ich bin noch ein blutiger Anfänger, was autoit angeht.

    Das heißt, ich müsste den String dann irgendwie umwandeln, bevor ich diese Befehle anwenden kann, oder?

    Sonst bekomme ich doch eine null zurück, oder?

    Einmal editiert, zuletzt von hexpirator (7. November 2011 um 12:17)

  • Hier mal ein Beispiel, was ich für eines meiner projekte gebraucht habe:

    [autoit]

    $hRequest = _WinHttpOpenRequest($hConnect, "POST", "/powerq1/statistik.php", "HTTP/1.1") ; Startet den Request
    _WinHttpSendRequest($hRequest, "Content-Type: application/x-www-form-urlencoded" & @CRLF)
    _WinHttpReceiveResponse($hRequest) ; liefert den HTML QUellcode der Aufgerufenen Seite
    Local $data = ""
    Do
    $data &= _WinHttpReadData($hRequest)
    Until @error
    $data = StringReplace($data, "<td >", "") ; löscht alle <td>
    $data = StringReplace($data, "</td>", "") ; löscht alle </td>
    $data = StringReplace($data, '<td class="right">', ""); löscht alle '<td class="right">'
    $data = StringStripWS($data, 4) ; löscht überflüssige Leerzeichen
    $avArray = _StringBetween($data, 'id="row', "</tr>") ;Sucht die spalten
    If @error Then ; wenn keine Spalten gefunden wurden
    Return 0
    EndIf
    For $i = 0 To UBound($avArray) - 1
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $avArray[$i] = ' & $avArray[$i] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Next

    [/autoit]

    Du musst zuerst die Stringposition raussuchen (oberer Teil)
    in der unteren Schleife kannst du dann mit IsNumber($avArray) überprüfen, ob der gefundene Wert eine Zahl ist.

    Ich habe hier mit HTTP Requests gearbeitet, aber dasselbe geht auch InetRead und BinarytoString

  • Hi Thelubu.

    Ich versuche gerade hinter dein erstes Beispielscript zu kommen.

    Gibt es denn eine Möglichkeit was in &read gespeichert wird anzeigen zu lassen?

    Nur so zur Kontrolle, ob da überhaupt etwas passiert?

  • Wenn du auf die Variable klickst und dann Alt+d drückst,
    schreibt der den Wert in die Console.

    [autoit]

    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Read= ' & $Read& @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    So sollte es dann aussehen

  • Angenommen ich habe jetzt nach einem Artikel gesucht und möchte diesen String "Angebote ab &euro;&nbsp;64,02<" auswerten.
    Das geht wahrscheinlich nicht, weil sich ja der Preis ständig ändert, oder?

    Wie kann ich denn realisieren, dass der Preis, der sich ja ständig ändert mit im String auftaucht?

    Gibt es denn eine Funktion, die mir z.B. ausgehend von dem Zeichen "A" von Angebote weitere 30 Zeichen in einen String packt?
    Ich hoffe es war verständlich. 8|

    Muss ich da mit StringTrimLeft und StringTrimRight arbeiten?

    Gruß

    2 Mal editiert, zuletzt von hexpirator (10. November 2011 um 11:35)

  • schick mir mal ne PN mit dem Seitenquelltext, ich schau mal nach wie man das am besten hinkriegt

  • Hallo.

    Dank TheLuBu habe ich es nun geschafft das Script zu schreiben.

    Sogar eine GUI habe ich hin bekommen *schulterklopf ;)

    doch einer Frage habe ich trotzdem. Siehe unten.

    Hier das Script:

    Spoiler anzeigen
    [autoit]

    #cs

    [/autoit] [autoit][/autoit] [autoit]

    By Hexpirator

    [/autoit] [autoit][/autoit] [autoit]

    Dieses Script öffnet eine Excel-Datei, liest Daten aus der 2. Spalte der Tabelle, sucht danach
    im Internet "Geizhals.at/deutschland" prüft den dazugehöringen Preis und schreibt ihn in die
    4. Spalte der Tabelle zurück.
    #ce
    #include <Excel.au3>
    #Include <String.au3>
    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Preisabruf", 371, 243, 206, 124)
    $Group1 = GUICtrlCreateGroup("Bitte hier den Dateipfad zur abzufragenden Exceltabelle eintragen", 8, 8, 353, 105)
    $Exceldatei = GUICtrlCreateInput("C:\Dokumente und Einstellungen\Admin\Desktop\Test.xls", 16, 40, 337, 21)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Los = GUICtrlCreateButton("Los", 8, 184, 123, 49, $WS_GROUP)
    $Abbrechen = GUICtrlCreateButton("Abbrechen", 240, 184, 123, 49, $WS_GROUP)
    $Group2 = GUICtrlCreateGroup("Anzahl der zu durchsuchenden Zeilen eingeben:", 8, 120, 289, 57)
    $Zeilen = GUICtrlCreateInput("", 16, 144, 81, 21)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE;Wird ausgeführt, wenn der Schließen Button gedrückt wird
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case $Los;Wird ausgeführt, beim Druck auf den Los-Button
    _execute()

    [/autoit] [autoit][/autoit] [autoit]

    Case $Zeilen;Wird ausgeführt, wenn bei GUICtrlCreateInput ENTER gedrückt wird
    _execute()

    [/autoit] [autoit][/autoit] [autoit]

    Case $Abbrechen;Wird ausgeführt, beim Druck auf den Abbrechen Button
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd
    ;_________________________________________
    Func _execute()

    [/autoit] [autoit][/autoit] [autoit]

    $Exceldatei = GUICtrlRead ($Exceldatei)
    $Zeilen = GUICtrlRead ($Zeilen)
    $xls = StringRight($Exceldatei, 3) ;speichert die letzten 3 Zeichen der Variable $Exceldatei in $xls
    If $xls = "xls" Then ;Wenn $xls = "xls" dann versuche Exceldatei zu öffnen
    $oExcel = _ExcelBookOpen($Exceldatei)
    If @error = 1 Then
    MsgBox(48, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden") ;Versteht sich von selbst
    Exit
    ElseIf @error = 2 Then
    MsgBox(48, "Fehler!", "Die Datei existiert nicht!") ;Versteht sich von selbst
    Exit
    EndIf
    Else
    MsgBox(48,"Fehler","Bitte Dateipfad überprüfen",3)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $Zeilen ; ich gehe jetzt mal von 10 Sachen aus
    $Cell = _ExcelReadCell($oExcel, $i, 2) ; erste Spalte in der Exceltabelle

    [/autoit] [autoit][/autoit] [autoit]

    $Read = _InetRead("http://www.geizhals.at/deutschland/?in=&fs="&$Cell,1) ;Download Internetseite + Zelleninhalt
    if @error <> 0 Then
    MsgBox(48,"Fehler","Es ist ein Fehler mit dem Internet aufgetreten")
    EndIf
    $Read = BinaryToString($Read) ; gibt den HTML Quellcode der Suchseite aus
    ;-------------------------
    $avArray = _StringBetween($Read, "&euro;&nbsp;", "</a>") ; gibt String zwischen den angegebenen Strings zurück

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($avArray) ; stellt den Inhalt eines Array in einem Fenster dar fürs Debug

    [/autoit] [autoit][/autoit] [autoit]

    ;-------------------------
    _ExcelWriteCell($oExcel, $avArray[0], $i, 4) ; schreibt den Preis in die 2 Spalte der Exceldatei $avArray[0] enthält den 1. gefundenen Preis $avArray[1] den 2. usw.
    Next
    MsgBox(64,"Preisabruf","Der Preisabruf war erfolgreich",3)

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; Ende ___________________________________________

    [/autoit]

    Nun zu meiner Frage. Wie kriege ich das hin, dass ich bei einer Fehlermeldung: siehe unter MsgBox nicht ständig das Programm killen muß, sondern wieder zur Eingabe der richtigen Daten zurückkehren kann?

    Gruß...

    2 Mal editiert, zuletzt von hexpirator (14. November 2011 um 12:35)

  • Habe ich gemacht, nur das Problem ist jetzt, dass die Message:
    "Fehler","Bitte Dateipfad überprüfen"
    in einer Endlosschleife immer wieder angezeigt wird, bis ich dasd Script manuell kille.
    Ich komme einfach nicht dahinter was ich falsch mache.

  • poste bitte nochmal den gesamten, geänderten Qullcode, kann mir grade nicht vorstellen, warum das in ner Endlosschleife laufen sollte

  • Hallo hexpirator.

    du überschreibst dir in Zeile 53 die ControlID für das Input, ich denke daran liegt der Fehler (vor allem wenn nichts eingetragen ist, mach es so:

    [autoit]

    Func _execute()

    [/autoit][autoit][/autoit][autoit]

    $Exceldatei = GUICtrlRead($Exceldatei)
    $iZeilen = GUICtrlRead($Zeilen)
    $xls = StringRight($Exceldatei, 3) ;speichert die letzten 3 Zeichen der Variable $Exceldatei in $xls
    If $xls = "xls" Then ;Wenn $xls = "xls" dann versuche Exceldatei zu öffnen
    $oExcel = _ExcelBookOpen($Exceldatei)
    If @error = 1 Then
    MsgBox(48, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden") ;Versteht sich von selbst
    Return
    ElseIf @error = 2 Then
    MsgBox(48, "Fehler!", "Die Datei existiert nicht!") ;Versteht sich von selbst
    Return
    EndIf
    Else
    MsgBox(48, "Fehler", "Bitte Dateipfad überprüfen", 3)
    Return
    EndIf

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $iZeilen ; ich gehe jetzt mal von 10 Sachen aus
    $Cell = _ExcelReadCell($oExcel, $i, 2) ; erste Spalte in der Exceltabelle
    $Read = InetRead("http://www.geizhals.at/deutschland/?in=&fs=" & $Cell, 1) ;Download Internetseite + Zelleninhalt
    If @error <> 0 Then
    MsgBox(48, "Fehler", "Es ist ein Fehler mit dem Internet aufgetreten")
    EndIf
    $Read = BinaryToString($Read) ; gibt den HTML Quellcode der Suchseite aus
    ;-------------------------
    $avArray = _StringBetween($Read, "&euro;&nbsp;", "</a>") ; gibt String zwischen den angegebenen Strings zurück

    [/autoit][autoit][/autoit][autoit]

    ;_ArrayDisplay($avArray) ; stellt den Inhalt eines Array in einem Fenster dar fürs Debug

    [/autoit][autoit][/autoit][autoit]

    ;-------------------------
    _ExcelWriteCell($oExcel, $avArray[0], $i, 4) ; schreibt den Preis in die 2 Spalte der Exceldatei $avArray[0] enthält den 1. gefundenen Preis $avArray[1] den 2. usw.
    Next
    MsgBox(64, "Preisabruf", "Der Preisabruf war erfolgreich", 3)
    ;falls kein neuer Durchlauf dann hier exit
    EndFunc ;==>_execute

    [/autoit]

    mfg autoBert

  • Hallo AutoBert.

    Danke für den Bugfix.

    Es läuft alles soweit ganz gut, nur wenn ich den Button "Los" mit der Maus betätige, dann kommt erst die Message, dass die Abfrage erfolgreich war, doch dann öffnet sich die selbe xls-Datei und der Spaß beginnt von vorne.
    Ein Return in Zeile 36 hat das Problem eliminiert.

    Nee Quatsch. das Problem besteht immer noch. Return wieder rausgenommen.
    Komischer Fehler.

    Noch ein Problem: Wenn ich das Script auf der Arbeit ausführe, dann kommt die Fehlermeldung:
    Es ist ein Fehler mit dem Internet aufgetreten.
    was verständlich ist, weil der Internetzugang über einen Proxyserver gesperrt ist und durch Benutzername und Passwort freigeschaltet werden muss.

    Hat einer eine Idee, wie ich das bewerkstelligen kann?

    Gruß, Hexpirator

    2 Mal editiert, zuletzt von hexpirator (15. November 2011 um 06:29)

  • Aus der AutoIt Hilfe

    Spoiler anzeigen
    [autoit]

    Der URL Parameter sollte in dieser Form sein "http://www.irgendeineseite.com/pfad/Datei.html" - so wie eine Adresse die in einen Browser eingegeben wird.
    Um einen Benutzernamen und ein Passwort zu verwenden werden diese im Format "benutzername:passwort@" vor den Servernamen geschrieben. Beispiel "http://meinbenutzername:meinpasswort@http://www.irgendeineseite.com"

    [/autoit]
  • Hallo hexpirator,

    die Variable $Exceldatei ist auch doppelt belegt:

    [autoit]

    Func _execute()

    [/autoit][autoit][/autoit][autoit]

    $sExceldatei = GUICtrlRead($Exceldatei)
    $iZeilen = GUICtrlRead($Zeilen)
    $xls = StringRight($sExceldatei, 3) ;speichert die letzten 3 Zeichen der Variable $Exceldatei in $xls
    If $xls = "xls" Then ;Wenn $xls = "xls" dann versuche Exceldatei zu öffnen
    $oExcel = _ExcelBookOpen($sExceldatei)
    If @error = 1 Then
    MsgBox(48, "Fehler!", "Das Excel-Objekt konnte nicht erstellt werden") ;Versteht sich von selbst
    Return
    ElseIf @error = 2 Then
    MsgBox(48, "Fehler!", "Die Datei existiert nicht!") ;Versteht sich von selbst
    Return
    EndIf
    Else
    MsgBox(48, "Fehler", "Bitte Dateipfad überprüfen", 3)
    Return
    EndIf

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $iZeilen ; ich gehe jetzt mal von 10 Sachen aus
    $Cell = _ExcelReadCell($oExcel, $i, 2) ; erste Spalte in der Exceltabelle
    $Read = InetRead("http://www.geizhals.at/deutschland/?in=&fs=" & $Cell, 1) ;Download Internetseite + Zelleninhalt
    If @error <> 0 Then
    MsgBox(48, "Fehler", "Es ist ein Fehler mit dem Internet aufgetreten")
    EndIf
    $Read = BinaryToString($Read) ; gibt den HTML Quellcode der Suchseite aus
    ;-------------------------
    $avArray = _StringBetween($Read, "&euro;&nbsp;", "</a>") ; gibt String zwischen den angegebenen Strings zurück

    [/autoit][autoit][/autoit][autoit]

    ;_ArrayDisplay($avArray) ; stellt den Inhalt eines Array in einem Fenster dar fürs Debug

    [/autoit][autoit][/autoit][autoit]

    ;-------------------------
    _ExcelWriteCell($oExcel, $avArray[0], $i, 4) ; schreibt den Preis in die 2 Spalte der Exceldatei $avArray[0] enthält den 1. gefundenen Preis $avArray[1] den 2. usw.
    Next
    MsgBox(64, "Preisabruf", "Der Preisabruf war erfolgreich", 3)
    ;falls kein neuer Durchlauf dann hier exit
    EndFunc ;==>_execute

    [/autoit]

    Noch ein Problem: Wenn ich das Script auf der Arbeit ausführe, dann kommt die Fehlermeldung:
    Es ist ein Fehler mit dem Internet aufgetreten.
    was verständlich ist, weil der Internetzugang über einen Proxyserver gesperrt ist und durch Benutzername und Passwort freigeschaltet werden muss.

    Hat einer eine Idee, wie ich das bewerkstelligen kann?

    Ganz einfach freischalten lassen oder es nur zu Hause benutzen,

    mfg autoBert