HTML einlesen / Sonderzeichen
-
Hi!
Ich habe eine abgespeicherte HTML (heruntergeladen mit dem Sockets-Tutorial).
Diese möchte ich parsen und dabei Beträge auslesen.
Probleme machen mir vermutlich Umlaute und (das ist jetzt akut) ein NO BRAEK SPACE alias A0 alias á.Damit bekomme ich das NO BREAK SPACE leider nicht weg, trim() und die atof funzt dann natürlich auch nicht.
void Parser::parse(string& p_htmlContentSource) { char szUmlauteNachher[999999] = ""; CharToOem(p_htmlContentSource.c_str(),szUmlauteNachher); string p_htmlContent = string(szUmlauteNachher); int l_posBeginn = p_htmlContent.find( "Betrag" ); int l_posEnde = p_htmlContent.find( "EURO", l_posBeginn); string l_ergebnis = p_htmlContent.substr(l_posBeginn + 4, l_posEnde - l_posBeginn - 4); cout << "cout:" << l_ergebnis.c_str() << "!!!" << endl; trim(l_ergebnis); cout << "cout:" << l_ergebnis.c_str() << "!!!" << endl; l_posBeginn = l_ergebnis.find(","); if (l_posBeginn > 0) { l_ergebnis.replace(l_posBeginn, 1, "."); } angebot->preis = atof(l_ergebnis.c_str()); cout << "Aktuelles Gebot: " << angebot->preis << endl; }Angebot ist eine eigene kleine Klasse.
Wie man sieht, habe ich schon gnadenlos herumgespielt.....Ich habe nachher sogar etwas mit wstring versucht, aber das ging ganz direkt in die Hose


thx
-
Wenn das NO BRAEK SPACE alias A0 alias á ersatzlos raus soll, musste Dir die Funktion dafür wohl selbst schreiben - ist jedenfalls kein Problem oder?

-
Bratwurst 2 schrieb:
Wenn das NO BRAEK SPACE alias A0 alias á ersatzlos raus soll, musste Dir die Funktion dafür wohl selbst schreiben - ist jedenfalls kein Problem oder?

Ich hatte gestern auch noch die Idee, dass das trim() nicht klappte, weil es NO BREAK SPACEs nicht entfernt. Ob dem so ist - keine Ahnung.
Funktion selbst schreiben...

Wenn ich ehrlich bin: Ich bekomme das sicher irgendwie hin, nur vermutlich nicht wirklich sauber und wohl auch inperformant. Allein schon, weil ich nicht weiss, ob ich jetzt string, wstring, TCHAR, LCPTCxyzWASauchIMMER benutzen soll und wie ich nun konvertiere.
Für einen Coderahmen (oder echten lauffähigen) wäre ich also durchaus dankbar.
Zumal alle meine Versuche, nach dem á alias ... mit find() zu suchen fehlgeschlagen sind.

-
Ein fertiges Programm wird Dir hier wohl kaum einer schreiben.

HTML-Datei in Puffer(buf) schreiben + Puffer Null terminieren.
CharToOemA(buf, buf);// Bei CharToOemW geht das nicht, da brauchste extra neuen Zielpuffer.
string xstr(buf);
Ob CharToOem() notwendig ist, weiss ich nicht (kann man diskutieren),
es gehört jedenfalls nicht in die Parser::parse() Funktion.In der Parser::parse() Funktion nach "Betrag" und "EURO" suchen.
Das was zwischen "Betrag" und "EURO" steht muss in einen extra tempstring, den man, falls
da schon sauber ein Betrag (z.B. 8,44) drinn steht, an einen istringstream istr(tempstring);
übergeben kann und dann istr >> angebot->preis; und fertig.Was hältst Du von dem Plan?

Um die parse()Funktion zu schreiben, braucht man eine realistische Zeile,
wichtig dabei, das was zwischen "Betrag --- EURO" steht oder stehen könnte.
Musst Dir die HTML-Datei u.U. im Hexeditor ansehen.
Stell mal so eine Zeile vor!

mfg
-
Ich würde davon absehen, selber einen solchen Parser zu schreiben, es gibt bereits gute Bibliotheken dafür.
z.B. boost::spirit kann dir da sehr viel Arbeit ersparen.
-
Danke Euch beiden, ich werde mir beides mal ansehen. Man lernt ja nie aus :p