Quelltext einer Seite auslesen => Fehler
-
Moin moin,
Ich versuche mit diesem Quelltext den HTML-code einer Seite auszulesen:
http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc08007.php
bool ExtractHtmlCodeOfCurrentPage(TCppWebBrowser* pCppWebBrowser, TStrings* pOutputStrings, bool blHtml) { bool blRetVal = true; IHTMLDocument2 *HTMLDocument = NULL; IPersistFile *PersistFile = NULL; LONG ilFramesCount = 0; AnsiString slTmpFileExtension = blHtml ? ".html" : ".txt"; // Falls eine Seite geladen: if(!pCppWebBrowser->Busy && pOutputStrings && pCppWebBrowser->Document && AnsiString(pCppWebBrowser->LocationURL) != "\1:blank" && SUCCEEDED(pCppWebBrowser->Document->QueryInterface( IID_IHTMLDocument2, (LPVOID*)&HTMLDocument))) { // HTML-Code des Hauptdokuments speichern: if(SUCCEEDED(HTMLDocument->QueryInterface(IID_IPersistFile, (LPVOID*)&PersistFile))) { // HTML-Code des Hauptdokuments speichern: PersistFile->Save(WideString(String(ExtractFilePath(ParamStr(0))+ "0"+slTmpFileExtension)), false); PersistFile->Release(); // ggf. auch Frames-Code extrahieren: IHTMLFramesCollection2 *pFrames = NULL; if(SUCCEEDED(HTMLDocument->get_frames(&pFrames))) { // Anzahl der Frames bestimmen: pFrames->get_length(&ilFramesCount); if(ilFramesCount < 2) ilFramesCount= 0; VARIANT vFrame; VARIANT ret; vFrame.vt = VT_UINT; // für jedes Frame: for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++) { vFrame.lVal = ilFrameIndex; if(SUCCEEDED(pFrames->item(&vFrame, &ret))) { // Zeiger auf IHTMLWindow2 des Frames besorgen: IHTMLWindow2 *pWindow = NULL; if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2, (LPVOID*)&pWindow))) { // Zeiger auf IHTMLDocument2 des Frames besorgen: IHTMLDocument2 *pDoc = NULL; if(SUCCEEDED(pWindow->get_document(&pDoc))) { // Frame in der Datei "Framenummer.html" speichern: IPersistFile *PersistFile = NULL; if(SUCCEEDED(pDoc->QueryInterface(IID_IPersistFile, (LPVOID*)&PersistFile))) { PersistFile->Save(WideString(String(ExtractFilePath(ParamStr(0))+ IntToStr(ilFrameIndex+1) + slTmpFileExtension)), false); PersistFile->Release(); } pDoc->Release(); } pWindow->Release(); } } } pFrames->Release(); } } HTMLDocument->Release(); TStringList* pFileStrings = new TStringList; if(pFileStrings) { // Die gepufferten Dateien mit dem HTML-Code der // Seite in die RichEdit einlesen und die Dateien löschen: if(FileExists(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension)) { pOutputStrings->LoadFromFile(ExtractFilePath( ParamStr(0))+"0"+slTmpFileExtension); DeleteFile(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension); } if(ilFramesCount > 0) { for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++) { if(FileExists(ExtractFilePath(ParamStr(0))+IntToStr( ilFrameIndex+1) + slTmpFileExtension)) { pFileStrings->LoadFromFile(ExtractFilePath(ParamStr(0))+ IntToStr(ilFrameIndex+1) + slTmpFileExtension); pOutputStrings->Add("\n- - - Frame " + IntToStr(ilFrameIndex+1) + " - - -"); pOutputStrings->Add(pFileStrings->Text); DeleteFile(ExtractFilePath(ParamStr(0))+IntToStr( ilFrameIndex+1) + slTmpFileExtension); } } } delete pFileStrings; } } else { pOutputStrings->Clear(); blRetVal = false; } return blRetVal; }
Das ganze funktioniert auch soweit, dass der Quelltext gespeichert wird.
An der Stelle schmiert das Programm laut Debugger ab:if(FileExists(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension)) { crash//---> pOutputStrings->LoadFromFile(ExtractFilePath( crash//---> ParamStr(0))+"0"+slTmpFileExtension); DeleteFile(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension); }
Ich denke, dass es wahrscheinlich mehr an dem Aufruf der Funktion als an der Funktion selbst liegt:
TCppWebBrowser* browser = CppWebBrowser1; TStrings* outputstring; bool html = true; ExtractHtmlCodeOfCurrentPage(browser,outputstring, html);
Muss ich die "TStrings" irgendwie vorher initialisieren bevor ich die Funktion aufrufe ?
TStrings* outputstring; outputstring->LoadFromFile("0.txt");
Führt jedenfalls auch zu einem Fehler, obwohl die Datei 0.txt existiert.
Ich bin für alle Lösungsvorschläge offen
Danke,
Lusches
/edit akari : Bitte gleich die cpp-Tags statt der einfachen code-Tags verwenden, wenn du C++ Quellcode postest
-
Vergiss diesen Lösungsweg, wenn es dir nichts ausmacht mit den IndyKompo. zu arbeiten, nimm das hier:
//Html code der angeforderen URL in eine Stringliste laden AnsiString URL="www.web.de"; TMemoryStream *ms = new TMemoryStream(); TIdHTTP *HTTP = new TIdHTTP(NULL); HTTP->Get(URL,ms); ms->Position=0; // ganz wichtig!!! sonst schreibt er nichts in die StringList TStringList* sl = new TStringList(); sl->LoadFromStream(ms); delete ms; Memo1->Text=sl->Text; AnsiString Text= sl->Text; delete sl;
-
Lusches schrieb:
Muss ich die "TStrings" irgendwie vorher initialisieren bevor ich die Funktion aufrufe ?
Ja, da fehlt die Speicherzuweisung mittels new.
Und kein new ohne späteres delete!
-
Mir ist relativ egal, welche Komponente ich benutze. Die Hauptsache ist, dass ich an den Quelltext rankomme.
//Html code der angeforderen URL in eine Stringliste laden AnsiString URL="www.web.de"; TMemoryStream *ms = new TMemoryStream(); TIdHTTP *HTTP = new TIdHTTP(NULL); HTTP->Get(URL,ms); ms->Position=0; // ganz wichtig!!! sonst schreibt er nichts in die StringList TStringList* sl = new TStringList(); sl->LoadFromStream(ms); delete ms; Memo1->Text=sl->Text; AnsiString Text= sl->Text; delete sl; ShowMessage(Text);
Das habe ich ausgeführt und in der Zeile
HTTP->Get(URL,ms);
bekomme ich den das hier:
404 - not found
als Fehlermeldung.
-
Lusches schrieb:
404 - not found
Du hast eine nicht existierende Seite bzw. Resource angefordert.
Ein Hostname allein tut's nicht, du musst schon genau festlegen, was du laden willst.
Also z.B. www.webauftritt.de/index.html .
-
Normalerweise sollte www.google.de und www.web.de noch existieren
Das Problem habe ich jetzt mit der ersten Variante gelöst. Die Liste musste nur ordentlich initialisiert werden.TCppWebBrowser* browser = CppWebBrowser1; TStrings* outputstring = new TStringList; bool html = true; ExtractHtmlCodeOfCurrentPage(browser,outputstring, html); ShowMessage(outputstring->Text); delete outputstring;
Jetzt habe ich aber ein neues Problem. Ich habe wie hier ( http://www.c-plusplus.net/forum/viewtopic-var-t-is-39218-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html ) versucht einen POST-befehl an ein php-script zu schicken.
Das ganze sieht so aus:
TStringStream *Params = new TStringStream(""); Params->WriteString("author=Lusches&email=keinedmail%40gmx.de&url=http%3A%2F%2Fmeinddddeseite.de&comment=das+ist+ein+tttttttest+%21&submit=Submit+Comment&comment_post_ID=193&comment_parent=0"); IdHTTP1->Request->ContentType = "application/x-www-form-urlencoded"; Memo1->Text = IdHTTP1->Post("http://www.meineseite.de/wp-comments-post.php", Params); delete Params;
Dabei bekomme ich diesen Fehler:
[C++ Error] Unit1.cpp(153): E2285 Could not find a match for 'TIdHTTP::Post(WideString,TStringStream *)'
in dieser Zeile:
Memo1->Text = IdHTTP1->Post("http://www.meineseite.de/wp-comments-post.php", Params);
-
Sorry,
der Fehler lautet:[C++ Error] Unit1.cpp(153): E2285 Could not find a match for 'TIdHTTP::Post(char *,TStringStream *)'
Mit dem WideString habe ich rumexperimentiert, aber das hat auch nicht den gewünschten Erfolg gebracht.
Gruß
Lusches
-
probier mal das, scheinbar hat Post 3 Parameter:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-283905.html#283905
greetz KN4CK3R
-
KN4CK3R schrieb:
scheinbar hat Post 3 Parameter
TIdHTTP::Post ist mehrfach überladen.
Der letzte Beispielcode von Lusches kompiliert hier im CB2010 ohne Probleme.Mit dem ursprünglichen Thema des Threads hat das aber eigentlich nichts mehr zu tun ...
-
Um wieder zu dem ursprünglichen Problem zurückzukommen:
//Html code der angeforderen URL in eine Stringliste laden AnsiString URL="www.web.de"; TMemoryStream *ms = new TMemoryStream(); TIdHTTP *HTTP = new TIdHTTP(NULL); HTTP->Get(URL,ms); ms->Position=0; // ganz wichtig!!! sonst schreibt er nichts in die StringList TStringList* sl = new TStringList(); sl->LoadFromStream(ms); delete ms; Memo1->Text=sl->Text; AnsiString Text= sl->Text; delete sl;
Gibt mir jetzt keinen 404-not found Fehler sondern "Invalid argument to date encode" aus.
Der Fehler entsteht auch wieder in dieser Zeile:
HTTP->Get(URL,ms);
Kann jemand mit dem Fehler irgendwas anfangen ?