[C++] HTML-Seite parsen

Hegelbock

Ensign
Registriert
Nov. 2001
Beiträge
245
Hallo,

ich habe vor, ein Programm zu schreiben, welches mir eine HTML-Seite nach Links und verschiedenen Tags durchparst, und diese in einer Variable speichert.
Das parsen will ich mit einer Regex erledigen, doch leider habe ich keine Ahnung wie das in C++ funktionieren soll. Habe zwar mal gegooglet und regex++ gefunden, doch irgendwie steige ich da nicht durch.


Mein Ziel ist es, das ich einfach die HTML-Seite als string habe, dann eine regex drüberlaufen lasse, und überall da wo die Regex zutrifft, dieser Teil soll dann in ein array gespeichert werden. (siehe http://de3.php.net/manual/en/function.preg-match.php)
Wie könnte das funktionieren?

Des Weiteren hätte ich noch gerne ein Klasse, welche mir eine url als string, in ihre einzelne Bestandteile unterteilt und in ein array schreibt. Wisst ihr da was?(siehe http://de3.php.net/manual/en/function.parse-url.php ) :p

Ich hoffe ihr könnt mir weiterhelfen.
Grüsse Hegelbock
 
Die Links verweisen auf PHP Funktionen. Wenn Du die in C++ nachprogrammieren willst, bist Du ein bisschen beschäftigt :-). Einfacher wäre es eine Funktion zu realisieren, die Dein Problem löst.

Eine Lösung bei der Du nichts tun musst, kann ich Dir leider nicht bieten.

MfG

Arnd
 
Regex kenne ich jetzt ned aber an sich brauchst du ja nur nen (relativ) simplen scanner...

Erstellst dir einfach für deine Verschiedenen Tags die du scannen willst ScanToken, die lässt du dann auf den String mit der html datei los ...


Code:
bool CScanTokenLink::Scan(std::string s)
{
    //Fehlerbehandlung und so lassen wir mal weg
    
    // Checkstring sucht nach dem 2 Parameter im 1 Parameter wenn er gefunden wird wird er ausgeschnitten und gibt true zurueck
    if (CheckString(s,"<a href=\""))
    {
        //Link gefunden
        //URL auslesen und speichern lassen
        ReadURL(s);
        // Token gefunden, true zurueckgeben ... 
        return true;
    }

    return false;
}

Ist eben ein Token für einen Link, müsstest dir nur ne Scannerklasse dazu schreiben in der alle Scantoken z.B. in nem Vector liegen. Die Scantoken erstellen dann die Datenobjekte für die Gefundenen Tags. Danach kannst ja mit dennen anstellen was du willst ...


Hoffe mal das hilft die ne runde ...
 
boost hat 2 regex bibliotheken. eine davon wird auch in den nächsten c++ standard aufgenommen, die währen also ein guter anfang.


einen parser per hand zu schreiben ist keine gute idee solange man keine ahnung von sowas hat.

allerdings sind regex nicht zum parsen von ganzen dokumenten gedacht. du solltest also nicht versuchen damit den ganzen html code zu parsen, sondern nur spezielle tags.
 
@Siberian..Husky

naja so lange es kein "wichtiges" Projekt ist sag ich mal learning by doing ;)

Aber mal n bisserl OT, kenne jetzt aus der boost nur einen "Parser Generator". Welcher soll den aufgenommen werden? Habe selber in der Firma viel mit sowas zu tun von daher würde es mich interessieren ...


- booZy
 
boost hat eigentlich nur eine RegEx-Bibliothek, und zwar boost::regex. Daneben gibt's noch boost::spirit, was wohl ein ziemlich mächtiger Parser ist (habe ich aber noch nichts mit gemacht). Dem kann man in Templateform eine EBNF vorwerfen und er generiert passenden Code. Für den Standard ist nur boost::regex vorgeschlagen, spirit wäre definitiv oversized.
 
boost hat auchnoch xpressive, quasi eine verschmelzung von boost::regex und spirit. allerdings wird sie erst im nächsten feature release enthalten sein(die aktuelle version hat aber das review schon lange bestanden, ist also aufjedenfall problemlos einsetzbar).

xpressive bietet einige interessante features von spirit, ist aber wesentlich einfacher zu benutzen. (im grunde halte ich spirit für unbenutzbar. eine gute idee, aber man kann eben mit c++ templates mehr machen als man machen sollte ;). wenn man die geparsten daten weiterverarbeiten will wird der code absolut unlesbar.)


sicher ist leaning by doing eine nette sache, aber nicht um jeden preis. wie man einen parser schreibt kann man sich angucken wenn man wirklich einen schreiben muss - für einfache dinge ist das ziemlich übertrieben.
 
Zuletzt bearbeitet:
Hatte nur gefragt weil wir am überlegen waren auf der arbeit was mit spirit zu machen ...

Wegen Learning by doing:

Bei kleinen Sachen (wie das hier z.B.) bleibt der Parser aber auch sehr übersichtlich. Ist aber, wie vieles, Ansichtssache ...
 

Ähnliche Themen

Antworten
0
Aufrufe
896
Zurück
Oben