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 ?


Anmelden zum Antworten