Website parsen - Klappe die tausendste..

  • Hi Leute,

    ich habe einen Receiver, der die Filminformationen eines Films schön in einer Übersicht anzeigen kann, wenn die Daten entsprechend vorliegen. Dafür benötigt er ein Bild und eine XML Datei, in der die Daten zu finden sind. Ich möchte meine Filmsammlung nun mit den entsprechenden Daten anreichern, damit das alles am Fernseher auch schön aussieht :)

    Nun habe ich mir eine Webseite herausgesucht, von der ich die Daten haben möchte. Allerdings habe ich das noch nie gemacht und stoße schon sehr früh an meine Grenzen.

    Ich möchte in einem ersten Schritt, die ersten 20 Suchergebnisse auflisten, damit ich daraus den richtigen Treffer auswählen kann (da meine Namen sicher nicht immer die genau richtigen Titel sind..).

    Allerdings bekomme ich hier schon einen Fehler, den ich nicht verstehe. Und zwar schaffe ich es nicht, den Namen richtig zu extrahieren. Meine Textersetzung funktioniert nicht. Vor jedem Titel bleibt das <b> erhalten.

    Davon abgesehen, würde ich mich auch freuen, wenn mir zu diesem frühen Zeitpunkt gezeigt wird, was ich schlecht mache, bzw. was ich besser machen kann.

    Vielen Dank im Voraus :)

    Im folgenden Code, wird ein Array gebildet mit den Links zu den Vorschaubildern|Titel|Link zur Filmbeschreibung:

    Edit bernd670 : Unsichtbares Zeichen entfernt s. Post 5

    Grüße autoiter

    Einmal editiert, zuletzt von bernd670 (15. Mai 2015 um 20:46)

  • Hatte mir mal für sowas einen kleinen rudimentären HTML-Parser auf Basis von CSS-Selektoren geschrieben.
    Um zum Beispiel an die Filmtitel zu gelangen würde man das z.B. so machen:

    Spoiler anzeigen
  • Vielen Dank AspirinJunkie,

    das ist sehr interessant. Leider für mich schwer nachvollziehbar, weil ich immer noch nicht mit RegExp gearbeitet habe, obwohl ich mir das immer mal wieder vornehme.. (Wie so viele. Es ist unbestreitbar geil, sieht aber abschreckend fremd aus.).

    Beim ersten Versuch sieht das gebildete Array nicht wie erhofft aus. Aber ich schaue mir deine UDF jetzt mal genau an. Vielen Dank nochmal :)

    Grüße autoiter

  • Leider für mich schwer nachvollziehbar, weil ich immer noch nicht mit RegExp gearbeitet habe,

    Wie kommst du auf RegExp?
    Das sind Css-Selektoren.

    Hier mal zwei Arrays: Das eine für die Titel, das andere für die Bild-Urls:

    Spoiler anzeigen

    Die Funktion ist halt noch ziemlich rudimentär. Würde ich es mal auf volle CSS-Selector-Funktionalität ausbauen könnte man auch viel flexibler arbeiten.
    Aber für viele Fälle kann man schon sehr schnell wichtige Informationen filtern.

    • Offizieller Beitrag

    Allerdings bekomme ich hier schon einen Fehler, den ich nicht verstehe. Und zwar schaffe ich es nicht, den Namen richtig zu extrahieren. Meine Textersetzung funktioniert nicht. Vor jedem Titel bleibt das <b> erhalten.

    Hallo,
    ich weiss zwar nicht wie du es geschafft hast, aber in dem Array $aSubstitutes steht "<b>chr(129)" drin, wobei chr(129) ein nicht sichtbares Zeichen ist. Das merkst du wenn du z. B. mit Cursor darüber fährst, dann wird zwischen > und " noch ein Schritt gemacht.

    Lösche einfach mal das nicht sichbare Zeichen oder schreib gleich den ganzen String neu rein, dann sollte es funktionieren!

  • @bernd670
    Ach ne, gibts ja nicht. Ich habe das (glaube ich aus dem Quelltext im Browser kopiert).. Probiere ich gleich mal. Dankeschön! :thumbup:

    EDIT: Tatsache. Einmal neu geschrieben und schon funktionierte es :D

    @AspirinJunkie
    Vielen Dank. :thumbup:

    Ich meine die StringRegExpReplace-Operationen in deiner UDF. Ich werde sie auf jeden Fall testen. Wenn das gut funktioniert, nutze ich sie sicher auch. Ich kann von der Arbeit guter Programmierer ja nur profitieren.
    Mein aktuelles Problem damit ist, dass ich ja gerne auch verstehen möchte, was ich da tue. Die Suchbegriffe sind mir da aber noch völlig fremd.

    Danke euch bis dahin. Weitere Fragen werden wohl folgen :)

    EDIT: PS: Dabei habe ich auch gesehen, dass Alien 5 kommen wird. Freut mich als Fan der Reihe ungemein 8o

    Grüße autoiter

    • Offizieller Beitrag

    @bernd670
    Ach ne, gibts ja nicht. Ich habe das (glaube ich aus dem Quelltext im Browser kopiert).. Probiere ich gleich mal. Dankeschön!

    Das dacht ich mir fast, weil eingeben kann man das nur über Alt+0129 (Numpad)!

  • @bernd670
    Danke dir. Sag mal, wie hast du das unsichtbare Zeichen gesehen?
    Wahrscheinlich werde ich diesen Fehler nicht sofort wieder machen und würde in Zukunft wohl als Erstes den Text neu schreiben..
    Dennoch würde ich das gerne selbst auch so ermitteln können.

    Grüße autoiter

    • Offizieller Beitrag

    War eher Zufall, ich habe mal was anderes reingeschrieben damit hat es geklappt und dann wieder <b> reingeschrieben, hat auch geklappt. Dann hab ich mir den Text noch mal aus deinem Post genommen und im Hexeditor angeschaut.

  • Hi,
    Debuggen ergab, dass hinter den 3 Zeichen <b> noch ein viertes Zeichen chr(129) sitzt! Daher klappt das mit dem Ersetzen nicht...wird wohl eim c&p-Fehler sein ^^

    Ansonsten ist nicht viel auszusetzen, lediglich die Sonderzeichen solltest du noch korrekt darstellen, da hilft stringtobinary/binarytostring

    //EDIT Stunden zu spät....

  • Ah, ok. Danke euch Jungs.

    @Andy
    Naja, bernd670 war schneller, aber dennoch hast du weitere gute Infos ("Ansonsten ist nicht viel auszusetzen.., stringtobinary/binarytostring") gegeben.
    Dann mache ich damit erst einmal weiter.

    Wie gesagt. Erster Versuch und ein Fehler den ich nicht verstanden habe. Da fragt man gerne mal, ob es grundsätzlich überhaupt in Ordnung ist.

    Grüße autoiter

  • Hallo zusammen,

    jetzt bin ich nicht viel weiter gekommen und habe schon wieder Probleme. Eigentlich betrifft es weniger das Website parsen an sich, sondern um die Kontrolle der GUI controls, die ich mit den unterschiedlich vielen Daten erstelle.

    Da hatte ich zu @'AspirinJunkie' noch geschrieben, ich würde lieber verstehen, was ich tue. Als ich dann aber zu den Scrollbars kam, habe ich mir doch eine UDF besorgt. Melba ist wirklich ein Quell toller UDF ( - eigentlich nicht gut für mich, da ich es mir allzu gerne bequem mache..). Daher habe ich die UDF angehängt, aber auch schon in die untere Variante des Skripts kopiert, damit ihr das Skript auch direkt ausführen könnt.

    Das erste Skript ist die kurze Variante, für deren Ausführung man die angehängte UDF im gleichen Ordner braucht.

    Meine Frage:
    Ich möchte wissen, wie man unterschiedlich viele Controls richtig erstellt und richtig ausliest?
    Meine Umsetzung findet ihr in folgenden Zeilen (kurze Fassung):
    75-81(Die Erstellung der Controls)
    100-113 (Meine Umsetzung des Auslesens)

    Ich habe das dumpfe Gefühl, ich sollte das eher mit ControlGetHandle und ControlGetText machen. Das habe ich aber nicht richtig verstanden.

    Über eure Hilfe und Hinweise würde ich mich wieder sehr freuen.

    Kurze Variante:

    Spoiler anzeigen


    Lange Variante:

    Spoiler anzeigen
    • Offizieller Beitrag

    Hallo,

    besser ist wenn du auf die gespeicherten ID's zugreifst.

    AutoIt
    ; Hier wird kontrolliert, welches der in Schleife erstellten Controls angeklickt wurde.
    		If $hGUIMsg > 0 Then
    			For $i = 0 To $iHits - 1
    				If ($hGUIMsg = $idPic[$i]) Or ($hGUIMsg = $idLabel[$i]) Then
    					MsgBox(0, "", $aResultnames[$i][1])
    					ExitLoop
    				EndIf
    			Next
    		EndIf
  • Hey danke dir. Den Code auch gleich noch gekürzt :D

    Genau das hat mir auch Unbehagen bereitet, da ich mir nicht sicher war, ob das immer so klappt. Jetzt wo ich es so sehe, frage ich mich auch, wieso ich nicht darauf gekommen bin..

    Aber prinzipiell macht man das so mit der 'bedingten' Erstellung und Nutzung von Controls?

    Grüße autoiter

    • Offizieller Beitrag

    Kann man so machen, musst nur darauf achten die Controls auch wieder zu löschen bevor du sie mit neuen Controls überschreibst, wenn du z. B. die nächsten 20 anzeigen willst.

    Einfacher ist es am Anfang eine GUI zu erstellen die z. B. schon 20 Controls hat, auch in einer Schleife wie du es schon gemacht hast.
    Danach mit GuiCtrlSetImage bzw. GuiCtrlSetData nur neue Werte in die Controls schreiben und nicht benötigte zu deaktivieren.

  • Stimmt, die GUI und die Controls vorher zu erstellen, wäre wohl sinnvoll. Wahrscheinlich ist das auch schneller als mein Plan.
    Dies alles soll noch in eine Funktion kommen, die in Schleife für jeden auf meiner Platte gefundenen Titel aufgerufen wird. Nach der Entscheidung für eine Aktion zu einem Titel, wird die GUI gelöscht und beim nächsten Aufruf neu erstellt..

    Mal sehen. Jetzt kümmere ich mich mal um das parsen der Seite mit den ausführlichen Filminformationen und danach teste ich ein wenig mit meiner GUI.

    Danke nochmal :)

    Grüße autoiter