websites auswerten und mit ihnen interagieren

  • C++

  • obi--wan
  • 3728 Aufrufe 30 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • websites auswerten und mit ihnen interagieren

    Ich will mit C++ in mehreren meiner Projekte Daten von einer website hohlen, bzw. mit ihr (PHP, bzw. JavaScript) interagieren. Das HTML-File downloaden mit libcurl kann ich schon, aber mein Problem ist wie ich nun effizient einzelne Elemente extrahiere. Hab mal durch Zufall etwas zu dem Thema in JavaScript gefunden dort kann man mit verschiedenen Funktionen einzelne Tags extrahieren. Gibt es vieleicht eine Bibliothek die ähnliches kann für C++? Und wie sieht das mit der Interaktion aus, also irgendwelche Buttons auf dynamischen Webseiten klicken, zb. hier im Board einen Post posten?

    Wenn jemand ausführliche Tutorials oder Unterlagen hat wäre ich dafür dankbar. Oder wenn jemand weiß mit welchen Begriffen ich bei Google was zu dem Thema finde (hab schon ewig gesucht aber nix gefunden).

    Hoffe ihr könnt mir helfen!

    mfg
    obi--wan
  • Hi,
    ich würde auf der anderen Seite ansetzen und eine API-Schnittstelle deiner Seite erstellen. Damit geht alles einfacher UND wenn du die Seite von der Optik her änderst, funktioniert das Programm dann noch ;)

    Wenn mein Vorschlag nicht gut ist, würde ich die HTML-Datei mit regulären Ausdrücken parsen. Reguläre Ausdrücke in C++

    Gruß
    Broken Sword
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.
  • Hat noch wer ein (deutsches) Tutorial über Regular Expresions für mich? Aber nicht in .net weil ich würd gern Platformunabhängig bleiben. Hab ein wenig gesucht und herausgefunden das in den Boost Librarys eine Library für Regex drinen ist. Aber ich hab noch nie mit Regex gearbeitet, und versteh das nicht so ganz.

    mfg
    obi--wan
  • Es kommt mir fast so vor als wäre das einer der Wikipedia Artikel bei denen der Autor wollte das ihn keiner versteht.

    Ich hab noch ein wenig mehr gesucht und unteranderem mehrere Librarys zum parsen und auswerten von html files gefunden:
    HtmlDocument
    HTML Agility Pack

    Aber leider baut das eine auf .net auf und das andere ist eine ms Bibliothek. Deshalb bleibt mir wohl nichts anderes als Regular Expressions über, auserdem hab ich damit deutlich mehr Möglichkeiten.

    Ich suche jetzt eine Bibliothek für Regular Expressions in C++ und ein deutsches Tutorial dazu, denn das Thema ist so komplex das ich alle englischen bis jetzt nicht verstanden habe.

    Hoffe sowas läst sich finden!

    mfg
    obi--wan
  • Wieso bleibt dir nichts weiter als RegEx übrig? Ich hab doch geschrieben: Behandele das HTML-Dokument einfach als XML! Dann kannst du die Elemente alle schön und fein säuberlich mit jedem üblichen XMLParser durchlaufen und ihren Inhalt/Attribute überprüfen und auswerten.
    Da brauchst du keine grausigen String-Operationen a la RegEx.
  • voodoo44 schrieb:

    Wieso bleibt dir nichts weiter als RegEx übrig? Ich hab doch geschrieben: Behandele das HTML-Dokument einfach als XML!


    Das ist aber auch nur praktikabel solange die Webseiten xml konform geschrieben wurden. Die Browser sind oft sehr tollerant und die Entwickler der Seiten achten längst nicht alle drauf ob die Seiten komplett valide ist.

    Aber ich würde auch eher zu der xml variante tendieren. Nen eigenen ordentlichen parser zu schreiben ist definitiv komplizierter
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Seit wann werden Webseiten XML konform geschrieben? ;)

    Grundsätzlich gilt: Jedes öffnende Tag hat auch ein schließendes Tag. Hat es das nicht, kommt natürlich der XML-Parser durcheinander. Das gleiche Problem hast du aber auch dann, wenn du mit RegEx arbeitest - prüfst du nämlich auf Vorkommen eines Elementes, so hast du ein Problem, wenn dazu z.B. das schließende Tag nicht da ist - denn wie willst du sonst den Inhalt des (X)HTML-Elementes erkennen, wenn du garnicht weißt wo das Tag endet? ;)

    Die Variante mit dem XMLParser hat auch den Vorteil, dass du Inhalt und die jeweiligen Attribute SEHR leicht und schnell auslesen kannst. Ehe du das mit RegEx gelöst hast... :)
  • voodoo44 schrieb:

    Seit wann werden Webseiten XML konform geschrieben? ;)


    Alle webseiten die xhtml valide sind sind xml konform...

    voodoo44 schrieb:

    Grundsätzlich gilt: Jedes öffnende Tag hat auch ein schließendes Tag. Hat es das nicht, kommt natürlich der XML-Parser durcheinander. Das gleiche Problem hast du aber auch dann, wenn du mit RegEx arbeitest - prüfst du nämlich auf Vorkommen eines Elementes, so hast du ein Problem, wenn dazu z.B. das schließende Tag nicht da ist - denn wie willst du sonst den Inhalt des (X)HTML-Elementes erkennen, wenn du garnicht weißt wo das Tag endet? ;)

    Dann ist doch die Frage wie der gewählte xml parser auf einen Fehler reagiert. Im schlimmsten fall bricht er das weitere parsen ab. Wenn er das tut ist der nutzen eines fertigen XML Parsers gleich null... Ist das der fall ist (imho) eine eigene Implementierung sinnvoller.
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Das hab ich auch nie behauptet... Wir reden hier von Webseiten. Wenn die Webseite in XHTML oder in einem xml validem HTML stil geschrieben wurde kann ohne probleme mit einer existierenden xml-lib gearbeitet werden. Sonst nicht. Ich habe nie HTML und XHTML gleich gesetzt
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Ich schätze mal das weit über 50% der Webseiten nicht in xhtml, oder xml kompatibles html geschrieben sind. Und warscheinlich sind nicht viel weniger nicht einmal html konform, und werden nur durch die extrem tolleranten Browser dargestellt. Das "HTML Agility Pack" ist zum Beispiel, wenn ich das richtig verstanden habe ein umgebauter XML-Parser der jetzt mit HTML umgehen kann und auch deutlich toleranter ist. Das komt aber trotzdem nicht in Frage weil es auf .net aufbaut, und .net möchte ich auf keinen Fall einsetzten.

    Ein parser ist sicherlich die schnellere und einfachere Variante. Weswegen ich sie auch lieber nutztn würde, wenn ich denn einen für html geeignten finden würde. Aber da ich jetzt Interesse an den Regular Expressions gefunden habe, und mir noch ein paar andere anwendungsgebiete vorstellen könnte würde ich die gerne lernen.

    mfg
    obi--wan
  • Quatsch kaufen, RegEx ist nicht so komplex.
    Man sucht damit halt in einem Text nach bestimmten Regeln sag ich mal.
    Kleines Beispiel: "^" bedeutet Zeilenanfang, "$" Zeilenende, "." ein beliebiges Zeichen.

    Wenn ich also z.B. folgende Datei habe:

    Quellcode

    1. a
    2. b
    3. ccgggg
    4. dd
    5. e


    Und ich suche nach dieser regular Expression: "/^.$/" (die Slashes werden in vielen Sprachen verwendet, hat aber RegEx technisch keine Bedeutung)
    Dann sucht er nach etwas, was mit einem beliebigen Zeichen anfaengt und sofort wieder aufhoert. Also kurz gesagt alle Zeilen, die nur ein Zeichen enthalten.
    Das trifft hier zu auf: "a", "b", "e"

    Such dir irgendwelche Tutorials, muss nicht C++ sein, wie schon gesagt, sind RegEx in allen Sprachen (fast) identisch.
    Wie man nun die Methoden in der Boost Library aufruft, sollte mit der englischen Erklaerung auch gehen, wenn du das Prinzip von RegEx verstanden hast.

    PS: Weiteres Beispiel:
    "+" bedeutet, dass das zuvor angegebene Zeichen beliebig oft hintereinander steht, jedoch mindestens ein Mal.
    So wird bei "/g+/" die Zeile "ccgggg" gefunden. Und so weiter.
    Wenn du Fragen hast, frag, aber Geld wuerd ich auf keinen Fall dafuer ausgeben.
    Wo ist der Discord Server
  • Skyte schrieb:

    Quatsch kaufen, RegEx ist nicht so komplex.

    sicher ... ?

    Skyte schrieb:

    die Slashes werden in vielen Sprachen verwendet, hat aber RegEx technisch keine Bedeutung

    Natürlich haben sie eine Bedeutung - das sind sogenannte "Begrenzer", welche Beginn und Ende eines regulären Ausdrucks festlegen.

    Skyte schrieb:

    Wenn du Fragen hast, frag, aber Geld wuerd ich auf keinen Fall dafuer ausgeben.

    Wenn du dafür kein Geld ausgeben würdest, bist du wohl ein Hobby-Scripter ;)
    Bücher > OnlineTutorials ... :)

    In einem Buch wird nämlich auch die Verwendung von Begrenzern erklärt ;)
    Um mal bei dieser Kleinigkeit zu bleiben.

    Vielleicht drückst du dich auch einfach nur ungenau aus - aber so wirklich mit Fachwissen glänzen konntest du gerade nicht. Eventuell doch mal ein Buch kaufen? :rot:
  • Bücher > OnlineTutorials


    Das halte ich so pauschal auch für falsch. Bücher sind sicher, wenn es nur um den theoretischen Hintergrund zu irgendeinem Thema geht das Medium der Wahl, aber gerade wenn es um praktischere Sachen geht (wie eben der Umgang mit RegEx) finde ich ein gutes Onlinetutorial (idealerweise auf einem zweiten Monitor, auf dem ersten die Programmierumgebung ;)) wesentlich komfortabler. Mag aber auch immer eine individuelle Entscheidung sein, was man da bevorzugt.
  • nile schrieb:

    Bücher sind sicher, wenn es nur um den theoretischen Hintergrund zu irgendeinem Thema geht das Medium der Wahl, aber gerade wenn es um praktischere Sachen geht (wie eben der Umgang mit RegEx) finde ich ein gutes Onlinetutorial (idealerweise auf einem zweiten Monitor, auf dem ersten die Programmierumgebung ;)) wesentlich komfortabler.

    Naja... sagen wir es mal so:
    Chomsky-Hierarchie ? Wikipedia
    Regulärer Ausdruck ? Wikipedia
    Das gehört ja alles zu einem großen Gebiet ... Reguläre Ausdrücke ("RegEx") sind jetzt nicht nur die wilde Verkettung irgendwelcher Zeichen, die nach einem Suchausdruck suchen sollen.
    Aber da du "Hintergrund" schreibst, könnte man es glatt gelten lassen ;)

    Ich will hier jetzt nur nicht die Idee keimen lassen, reguläre Ausdrücke wären sowas wie das vom Threadersteller genannte "/^.$/" - da steckt ein bisschen mehr dahinter, als der gemeine PHP-Scripter meint ;)
  • Na das ich damit so viel Aufruhr errege hät ich mir nicht gedacht.

    Skyte schrieb:

    Ich frage mich, was der Threadersteller damit wohl vor hat.

    Bomben bauen, was sonst? Ich hab mir nur gedacht das die Recht nützlich wären beim Analysieren von Dateien, bzw. beim schreiben und lesen von Konfigurationsdateien und ähnlichem. Aber ich will keine Implementierung schreiben.

    Und mit Büchern hab ich schlechte erfahrungen gemacht. Hab mir mal ein C++ Buch geliehen in dem 10 Seiten lang Variablen erklert wurde und Objektorientierung war dan in einer erledigt. Bei einem Onlinetoturial such ich mir dann halt ein anderes aber ich kauf mir nicht hundert Bücher. Auserdem wenn dasso komplex ist das es ein Buch erfordert geht die Kosten/Nutzen Rechnung für mich nich ganz auf, denn dann benutze ich jetzt und in Zukunft lieber HTML-/XML-Parser.

    Ich bin übrigens immer noch auf der Suche nach einem geeigneten HTML-Parser.

    mfg
    obi--wan
  • obi--wan schrieb:

    Auserdem wenn dasso komplex ist das es ein Buch erfordert


    Quatsch, das ist nicht viel.
    Es ist nur eine wilde Verkettung irgendwelcher Zeichen, die nach einem Suchausdruck suchen sollen und auch nicht viel mehr als das von mir genannte "/^.$/".
    Z.B. sagen wir du suchst nach einem Zeilenumbruch, ich beachte jetzt mal "<br>", "<br/>" und "<br />", dann ist ein passender RegEx dafuer: "/<br ?\\/?>/i"
    Das "i" hinter dem Slash sagt nur, dass es nicht case sensitive sein soll, passt also auch auf grossgeschriebene Tags.
    Da der Slash bereits fuer die Begrenzung benutzt wird, muss man ihn escapen (muss man auch immer dann machen, wenn es in RegEx bereits eine Bedeutung hat (zB bei Fragezeichen, Plus, Stern, etc.)). Da Backslash auch das Escapezeichen fuer Strings ist, muss man den Backslash natuerlich doppelt schreiben, wie immer in einem String, wo ein Backslash drin sein soll.
    Und das Fragezeichen sagt, dass das Zeichen davor vorhanden sein kann, aber nicht muss (Leerzeichen und Slash sind in dem Beispiel also optional).
    (Eine Liste der ganzen Zeichen gibts halt zB bei Wikipedia).
    Wo ist der Discord Server

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von Broken Sword ()

  • hey ich denke auch das regexp's das beste sein werden. Alternativ kannst du sicher auch den Parser nehmen den Zerd vorgeschlagen hat.
    Falls du noch auf der Suche nach einem Leistungsstarken Framework bist schau dir einfach mal Qt an. Ist sehr umfangreich und sehr gut dokumentiert. Der englischen Sprache solltest du aber mächtig seien.
    Ansonsten kann man auch Perl nutzen, ebenfalls gut Dokumentiert und in C++ einbinden.
    gruß der f.o.g.
    Blacklist
    Meine UP's
    1 2

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von f.o.g. ()