HTML Code auswerten

  • hey also erstmal vorweg die Seite enthält leicht anstößige inhalte
    es geht um folgende Teilseite: http://www.skins.be/babes/

    also ich hab ein kleine Funktion geschrieben die mir alle Namen von A-Z und die dazugehörigen Links in 2 Arrays schreibt ..
    funktioniert auch alles ganz gut aber das ist echt extrem extrem langsam, weil ich den code erst in eine datei schreibe und dann immer zeile für zeile auslese um die bestimmten berreiche festzulegen damit nicht alle links und namen zurückgegeben werden...

    hier die Funktion:

    Spoiler anzeigen
    [autoit]

    ;wichtig ist der HTML Code ab zeile 615
    Func _Get()
    Local $URL_Babes = 'http://www.skins.be/babes/'
    Local $InetSource
    FileDelete($Temp)
    $InetSource = _INetGetSource($URL_Babes)
    FileWrite($Temp, $InetSource)

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

    #region AllBabes
    For $ii = 65 To 90
    TrayTip("", $ii, 1)
    Local $Start, $End, $Source = '', $Source2 = '', $Array
    For $i = 1 To _FileCountLines($Temp)
    If FileReadLine($Temp, $i) = ' <a name="' & Chr($ii) & '"></a>' Then
    $Start = $i ; der Startpunkt wird festgelegt
    ExitLoop
    EndIf
    Next
    For $i = 1 To _FileCountLines($Temp)
    If $ii = 66 Then
    $EndSource = ' <br class="clf"/>' ; nach B ist im HTML Code eine unregelmäßigkeit (Most popular on Skins.be )
    Else
    $EndSource = ' <div class="capital">' ;bei den anderen passt alles
    EndIf
    If FileReadLine($Temp, $i) = $EndSource Then
    If $i > $Start Then
    $End = $i ;Endpunkt wird festgelegt
    ExitLoop
    EndIf
    EndIf
    Next

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

    For $i = $Start + 4 To $End ;jetzt wird aus startpunkt und endpunkt ein Teilstring herausgefiltert indem dann per stringbetween(siehe unten) die namen und links herausgefiltert werden
    $Source2 &= FileReadLine($Temp, $i) & @CRLF
    Next

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

    $Array = _StringBetween($Source2, '">', '</a>');namen
    For $i = 1 To UBound($Array) - 1
    _ArrayAdd($aAll, $Array[$i])
    Next
    $Array = _StringBetween($Source2, '<a href="', '" title=');links
    For $i = 1 To UBound($Array) - 1
    _ArrayAdd($aAllU, $Array[$i])
    Next
    Next

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

    #endregion AllBabes

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

    EndFunc ;==>_GetBabes

    [/autoit]

    weiß jemand wie ich das schneller machen könnte?

    Einmal editiert, zuletzt von Reaker (3. April 2010 um 21:00)

  • schau dir mal das an:

    Spoiler anzeigen
    [autoit]

    ; WINHTTP Object example
    ;
    ; Retrieve the HTML source from a given URL
    ;
    ; Derived from a KiXtart script BBCodeParser.kix by Lonkero
    ;
    ; See also: http://www.gwspikval.com/jooel/scripts/…CodeParser2.kix
    ; and
    ; http://msdn.microsoft.com/library/en-us/…httprequest.asp

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

    $URL="http://www.AutoItScript.com"

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

    #include "GUIConstants.au3"

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

    ; Create a simple GUI for our output
    GUICreate ( "Event Test", 640, 480 )
    $GUIEdit=GUICtrlCreateEdit ( "HTTP Source Test:" & @CRLF, 10, 10 , 600 , 400 )
    GUISetState () ;Show GUI

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

    $httpObj = ObjCreate("winhttp.winhttprequest.5.1")
    $httpObj.open("GET",$URL)
    $httpObj.send()

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

    $HTMLSource = $httpObj.Responsetext

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

    GUICtrlSetData ( $GUIEdit, "The HTML source of " & $URL & " is:" & @CRLF & @CRLF & StringAddCR($HTMLSource) , "append" )

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

    ; Waiting for user to close the window
    While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    Wend

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

    GUIDelete ()

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

    exit

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • ähm das bringt mir doch nicht viel .. den html code habe ich ja^^

    das langsame ist halt dass die datei mit dem html code zeile für zeile ausgelesen wird und ich weiß nicht wie ich das über den memory machen kann

  • ähm das bringt mir doch nicht viel .. den html code habe ich ja^^

    das langsame ist halt dass die datei mit dem html code zeile für zeile ausgelesen wird und ich weiß nicht wie ich das über den memory machen kann


    Bei meinem Beispiel wird nix von Zeile für Zeile ausgelsen sondern du erhältst den Kopletten HTML Cod in einer Variable

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • ja super dass kann ich mit $source = _InetGetsource() auch machen :D

    also ich muss halt den html code günstig zuschneiden damit ich bei _StringBetween auch die die richtigen sachen bekomme und ich weiß halt nicht wie ich das machen soll dass es nicht über eine externe Datei sondern direkt im memory funktioniert

  • ich empfehle dir RegExp()

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • es wäre erstmal schön eine Funktion einzustellen, die in sich grundsätzlich funktionsfähig ist.
    Da ich Deine Funktion nicht ausführen kann, erspare ich mir die Suche nach einer Lösung.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Schnuffel .. ja ich kann die includes für dich mal schnell reinmachen

    kleinen moment

    edit so jetzt ist sie ausführbar:

    Spoiler anzeigen
    [autoit]

    ;wichtig ist der HTML Code ab zeile 615

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

    #include <Array.au3>
    #include <File.au3>
    #include <String.au3>
    #include <inet.au3>
    Global $Temp = @ScriptDir & '\temp'
    Global $aAll[1], $aTP[1], $aMP[1]
    Global $aAllU[1], $aTPU[1], $aMPU[1]

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

    _Get()

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

    Func _Get()
    Local $URL_Babes = 'http://www.skins.be/babes/'
    Local $InetSource
    FileDelete($Temp)
    $InetSource = _INetGetSource($URL_Babes)
    FileWrite($Temp, $InetSource)

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

    #region AllBabes
    For $ii = 65 To 90
    TrayTip("", $ii, 1)
    Local $Start, $End, $Source = '', $Source2 = '', $Array
    For $i = 1 To _FileCountLines($Temp)
    If FileReadLine($Temp, $i) = ' <a name="' & Chr($ii) & '"></a>' Then
    $Start = $i ; der Startpunkt wird festgelegt
    ExitLoop
    EndIf
    Next
    For $i = 1 To _FileCountLines($Temp)
    If $ii = 66 Then
    $EndSource = ' <br class="clf"/>' ; nach B ist im HTML Code eine unregelmäßigkeit (Most popular on Skins.be )
    Else
    $EndSource = ' <div class="capital">' ;bei den anderen passt alles
    EndIf
    If FileReadLine($Temp, $i) = $EndSource Then
    If $i > $Start Then
    $End = $i ;Endpunkt s
    ExitLoop
    EndIf
    EndIf
    Next

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

    For $i = $Start + 4 To $End ;jetzt wird aus startpunk und endpunkt ein Teilstring herausgefiltert indem dann per stringbetween(siehe unten) die namen und links herausgefiltert werden
    $Source2 &= FileReadLine($Temp, $i) & @CRLF
    Next

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

    $Array = _StringBetween($Source2, '">', '</a>');namen
    _ArrayDisplay($array, $ii & " namen")
    For $i = 1 To UBound($Array) - 1
    _ArrayAdd($aAll, $Array[$i])
    Next
    $Array = _StringBetween($Source2, '<a href="', '" title=');links
    _ArrayDisplay($Array, $ii & " links")
    For $i = 1 To UBound($Array) - 1
    _ArrayAdd($aAllU, $Array[$i])
    Next

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

    Next

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

    #endregion AllBabes

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

    EndFunc ;==>_GetBabes

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]
  • ich kapier nicht wo da das problem liegt

    pseudocode

    1. quelltext in variable $source einlesen
    2. source zuschneiden und in tmp speichern (source nicht überschreiben)
    3. tmp mit stringbetween bearbeiten
    4. ermittelte daten verarbeiten
    5. source zuschneiden und in tmp speichern (source nicht überschreiben)
    6. tmp mit stringbetween bearbeiten
    7. ermittelte daten verarbeiten
    .......

  • ja genau es funktioniert .. aber es ist wie oben geschrieben saumäßig langsam und ich weiß eben nicht wie ich das anders lösen kann

  • Seubo würde hier sagen : Ne da nimmt man ganz klar Regexp() ^^

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Das Problem liegt daran das die Lösung hässlich und langsam ist. (Glaube ich). RegExp würde hier in 2 Zeilen alles klarmachen.


    mein reden

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • ja ich würde auch jedem empfehlen RegEx zu verwenden.
    Problem ist nur dass die meisten damit nicht zurecht kommen.

    Und da der vorschlag schon gebracht wurde wollte ichs nicht nochmal schreiben^^

  • ja ich würde auch jedem empfehlen RegEx zu verwenden.
    Problem ist nur dass die meisten damit nicht zurecht kommen.

    Und da der vorschlag schon gebracht wurde wollte ichs nicht nochmal schreiben^^

    Ach Seubo hat doch ein super TuT geschrieben^^

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ein RegExp sollte nicht für alles verwendet werden. Wenn ein Treffer zu lang ist, bricht das Skript ab. Ich habe jetzt einfach mal ein Beispiel gemacht:

    Spoiler anzeigen
    [autoit]

    Dim $aModels
    $data = InetRead("http://www.skins.be/babes/")
    If $data Then
    $data = BinaryToString($data, 4) ; Die Seite ist UTF-8 kodiert. Also die Binärdaten als UTF-8 behandeln

    ; Liste holen
    $start = StringInStr($data, '<div id="babes_list">', 1)
    $end = StringInStr($data, '<div id="rightColumn">', 1)
    $data = StringMid($data, $start, $end-$start)

    ; Most popular löschen
    $start = StringInStr($data, '<div id="top_cloud"', 1)
    $end = StringInStr($data, '</div>', 1, 1, $start)
    $data = StringLeft($data, $start) & StringTrimLeft($data, $end)

    ; Models auslesen
    $models = StringRegExp($data, '<a href="(.*?)" title=".*?"\s*>\s*(.*?)\s*</a>', 3)
    $bound = UBound($models)
    Dim $aModels[$bound/2][2]
    For $i = 0 To $bound-1 Step 2
    $aModels[$i/2][0] = $models[$i+1] ; Name
    $aModels[$i/2][1] = $models[$i] ; URL
    Next

    EndIf
    #include<Array.au3>
    _ArrayDisplay($aModels)

    [/autoit]
  • ja RegExp könnte gut funktionieren ... wäre halt gut wenn jemand RegExp beherscht und mir einen Ansatz geben könnte, weil RegExp ist so eine der wenigen Funktionen die ich 0,0 kann^^

    Edit

    oh wo cool danke Prog@ndy .. das funktioniert super =)

  • Wo bricht das was ab. Bei deinem Beispiel bricht doch nix ab und gehts extrem schnell

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.