HTML nach Wert Durchsuchen



  • 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



  • hmm bababa doch kein C ...

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    
    bool read_html_content(const std::string&, const std::string&, const std::string&, std::vector<std::string>&);
    
    int main(int argc, char* argv[])
    {
      	unsigned int value = 0;
    
    	std::cout << "Tag-Open: " << std::flush;
    	std::string string_tag_beg;
    	std::getline(std::cin, string_tag_beg);
    	std::cout << "Tag-Close: " << std::flush;
    	std::string string_tag_end;
    	std::getline(std::cin, string_tag_end);
    
    	std::vector<std::string> found_content;
    
    	read_html_content(string_tag_beg, string_tag_end, "test.html", found_content);
    	for (size_t data = 0; data < found_content.size(); ++data)
    		std::cout << found_content[data] << std::endl;
    
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();	
    
    	return 0;
    }
    
    bool read_html_content(const std::string& string_tag_beg, const std::string& string_tag_end, const std::string& filename, std::vector<std::string>& vec_data)
    {
    	std::ifstream file_stream(filename.c_str(), std::ios::in);
    
    	if (file_stream.is_open() == false || file_stream.good() == false)
    		return false;
    
    	std::string string_line;
    	std::string string_content;
    	while (file_stream.eof() == false)
    	{
    		std::getline(file_stream, string_line);
    		string_content += string_line;
    	}
    
    	file_stream.close();
    
    	std::string::size_type pos_begin	= 0;
    	string_content.find(string_tag_beg, 0);
    	std::string::size_type pos_end		= 0;
    
    	while (((pos_begin = string_content.find(string_tag_beg, pos_begin + string_tag_beg.length())) != std::string::npos) && ((pos_end = string_content.find(string_tag_end, pos_begin)) != std::string::npos))
    		vec_data.push_back(string_content.substr(pos_begin + (string_tag_beg.length()), pos_end - pos_begin - (string_tag_beg.length())));
    
    	return true;	
    }
    

    ... noch Fragen? 😉 Ist nur ein Fehler drin ... das wäre aber ein wenig komplexer den zu beseitigen ... (dürft mal versuchen drauf zu kommen)

    aja
    test.html

    <html>
        <head>
            <title>Test 01</title>
        </head>
        <body>
            <h1>Test 02</h1><h1>Test 03</h1><h1>Test 04
            </h1>
        </body>
    </html>
    

    aja zum finden des Fehlers mal nen verschachteltes <h1> Element angeben und dann mal als such Element das h1 angeben ...



  • (D)Evil schrieb:

    ...
    

    du lieber himmel 😮
    schon mal jester's signatur gesehen?


Anmelden zum Antworten