HTML nach Wert Durchsuchen
-
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 Bezeichnerif (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?
-
(D)Evil schrieb:
hmm bababa doch kein C ...
sorry and very nice

-
ten:
die scheint ja auf dich zu zutreffen ... und wenn du mich in irgendeiner weise beleidigen willst ... dann nicht hier, sondern in einem Chat oder auf der Straße ...
-
(D)Evil schrieb:
ten:
die scheint ja auf dich zu zutreffen ... und wenn du mich in irgendeiner weise beleidigen willst ... dann nicht hier, sondern in einem Chat oder auf der Straße ...ich bin nun mal ein notorischer lästerer.
nimm's nicht persönlich
-
dein code funktioniert Klasse deinen fehler hab ich gemerkt was du meinst