C++ Builder Snippets  

TCppWebBrowser: Zugriff auf den HTML-Quelltext der Seite bzw. den Inhalt als Plain-Text:
 
Mit Hilfe folgender Routine kann der HTML-Code (bzw. der Text) der aktuell angezeigten Seite in die Datei geschrieben und anschließend "weiterverarbeitet" werden. Der Code funktioniert auch auf den Seiten mit Frames.
#include <mshtml.h>

//---------------------------------------------------------------------------
// Funktion ExtractHtmlCodeOfCurrentPage() lädt den HTML-Code oder den Text
// der aktuell angezeigten Seite in die übergebene TStrings-Instanz
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// TCppWebBrowser* pCppWebBrowser: Zeiger auf die TCppWebBrowser-Instanz
// TStrings* pOutputStrings      : Zeiger auf die TStrings-Instanz für die
//                                 Ausgabe des HTML-Codes oder des Seiteninhalts
// bool blHtml                   : Format der Daten
//                                 (true: HTML-Code, false: Plain Text)
//---------------------------------------------------------------------------
// Beispielaufruf (s. auch Beispielprojekt): 
// ExtractHtmlCodeOfCurrentPage(CppWebBrowser1,  RichEdit1->Lines, true);
//---------------------------------------------------------------------------
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) != "about: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;
}



Screenshot des Beispielprogramms
Screenshot des Beispielprogramms


  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2002 by S. Kreutzmann