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 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 ...