HTML nach Wert Durchsuchen



  • wie such ich in einem HTML Quellcode nach einen ganzbestimmten abschnitt

    bsp.
    ich hab in einer html seite einen abschnitt mit

    <h1 id="tut_title">Das ist Hier</h1>
    

    ich möchte nun alles von

    <h1 id="tut_title">
    

    bis

    </h1>
    

    auslesen

    ener ne idee



  • ist doch ganz einfach die datei durchlesen bis man auf <h1 id="tut_title"> stost dann alles speichern bis man auf </h1> stosst.
    Wenn du nicht weist wie du das implentieren sollst dann google mal ein bisschen.

    mfg tobZel



  • Wichtig ist nur, die Datei NICHT binär auszulesen.



  • n paar stichworte nach was ich googlen soll denn ich google scho den halben tag

    THX 😃 😕



  • hmm
    std::ifstream ... std::string ... std::string::find ... std::find_first_of (muss dann halt als anfangspos die pos von std::find nehmen ... damit bestimmst de das schließen tag ...) ...



  • CodeFinder schrieb:

    Wichtig ist nur, die Datei NICHT binär auszulesen.

    wie sonst?



  • Versteh nur ?? 😕



  • halt std::ios::binary weglassen ...

    std::ifstream file_stream(std::ios::in);
    if (file_stream.is_open() == false || file_stream.good() == false)
        return false;
    
    // so oder ähnlich jede Zeile in der Datei einlesen ...
    std::string string_line;
    std::getline(file_stream, string_line);
    
    // dann einfach mit find ran gehen ...
    std::string::size_type pos_begin = string_line.find("<h1 id="tut_title">", 0);
    if (pos == std::string::npos)
        std::cout << "Not found" << std::endl;
    else
    {
        std::string::size_type pos_end = string_line.find("</h1", pos_begin);
        if (pos == std::string::npos)
            std::cout << "Invalid html ... tag not closed!" << std::endl;
        else
        {
            // pos_end und pos_begin für deinne kram nutzen ^^
        }
    }
    
    file_stream.close();
    

    hab es hier nur rein gehauen ... dh sind Fehler drin (denk ich mal 🤡 )



  • sieht aber net übel aus isn anfang mit dem man was anfangen kann danke ich hab gerad an dem herumgebastelt

    [code]
    char c;
    	char name = '<>';
    
    	Flag=0; 
    	while((c = fgetc(d1))!=EOF) 
    	{ 
    		if(c == name) 
    		{
    			Flag = 5; 
    			continue; 
    		} 
    		if(c == ']') 
    		{
    			Flag = 0; 
    			fprintf(d2,"\n"); 
    		} 
    
    		if(Flag) fprintf(d2,"%c",c); 
    	} 
    [/code]
    

    aber dein code is besser 😃



  • ten schrieb:

    CodeFinder schrieb:

    Wichtig ist nur, die Datei NICHT binär auszulesen.

    wie sonst?

    Wie (D)Evil schon gepostet hat (danke 😉 !), eben im Text-Mode ( ➡ Also das Flag std::ios::binary nicht angeben).



  • klar hab das bisher ja scho überlesen nur henge ich an dieser possition

    // so oder ähnlich jede Zeile in der Datei einlesen ... 
    std::string string_line; 
    std::getline(file_stream, string_line);
    


  • Ist eigentlich das:

    if (file_stream.is_open() == false || file_stream.good() == false)
        return false;
    

    unperformanter, als das:

    if (!file_stream.is_open() || !file_stream.good())
        return false;
    

    ?

    (Kürzer ist es allemal 😋 .)



  • ja allemal nur getline spuckt hier nur fehler aus



  • wofür steht das pos bzw welchen wert hat er mein kompiler sagt

    error C2065: 'pos': nichtdeklarierter Bezeichner
    
    if (pos == std::string::npos) 
        std::cout << "Not found" << std::endl;
    


  • hmm sorry sachte ja sind tippfehler drin ... aber wenn du den code verstehen würdest wüsstes du es ... es muss pos_begin heißen ... es wird halt, falls das net gefunden wird von std::string::find nen std::string::npos zurück geliefert ...



  • hab ich mir scho gedacht, hatte das irgendwann mal gelesen



  • ich find's ja unnötig kompliziert. hier mal ein einfaches beispiel mit 'strstr'

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char *test = "hello <x>what's this?</x> world";
        char *tag_open = "<x>", *tag_close = "</x>";
        char *p1, *p2;
    
        p1 = strstr (test, tag_open);
        if (p1)
        {
            p1 += strlen (tag_open);
            p2 = strstr (p1, tag_close);
            if (p2)
                while (p1 < p2)
                    putchar (*p1++);
        }
    }
    


  • interesantes Beispiel



  • Ascharan schrieb:

    interesantes Beispiel

    jo, musst es nur erweitern, indem du die html-datei in den speicher holst und eine 0 dranhängst (string-ende). strstr braucht ja zugriff auf alles, mit einzel-bytes-einlesen geht strstr leider nicht, aber dafür ist es sicher schneller als dieses ganze c++ gefrickel von weiter oben.
    🙂
    edit: und nicht die datei zeilenweise einlesen. das geht schief. in HTML hat ein zeilenende keine bedeutung...



  • Jo das versuch ich grad es is auf jeden fall einfacher


Anmelden zum Antworten