首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

用c++Builder 怎么获取html内容

2012-02-12 
用c++Builder 如何获取html内容用c++Builder 如何获取html内容指定的区域[解决办法]C/C++ code//通过lpWeb

用c++Builder 如何获取html内容
用c++Builder 如何获取html内容 

指定的区域

[解决办法]

C/C++ code
        //通过lpWebDoc来取网页的代码。        AnsiString HtmlSrc;        if(lpWebDoc)        {            try            {                //先取出所有的源代码。                AnsiString StrTagName;                Variant Doc = lpWebDoc;                Variant Tag_HTML = Doc.OlePropertyGet("all");                int iCount = Tag_HTML.OlePropertyGet("length");                for(int i=0;i<iCount;i++)                {                    Variant Tag_Item = Tag_HTML.OleFunction("item",i);                    if(Tag_Item.VOleStr!=NULL)                    {                        Variant Tag_tagName = Tag_Item.OlePropertyGet("tagName");                        if(Tag_tagName.VOleStr!=NULL)                        {                            StrTagName = AnsiString(Tag_tagName.VOleStr).UpperCase();                            Variant Tag_outerHTML = Tag_Item.OlePropertyGet("outerHTML");                            if(Tag_outerHTML.VOleStr!=NULL)                            {                                if(StrTagName == "HTML" && HtmlSrc=="")                                {                                    //到这里就取出了页面的所有源代码                                                                        HtmlSrc = Tag_outerHTML.VOleStr;                                    break;                                }                            } //end of if(Tag_outerHTML.VOleStr!=NULL)                        }//end of  if(Tag_tagName.                    } //end of if(Tag_Item.                }//end of for            }catch(...){}        }//end of if(lpWebDoc)
[解决办法]
我来了!!!这两天事情太多,忙里抽闲才调试完这一段代码。以下代码在BCB6中测试通过
C/C++ code
#include <mshtml.h>//---------------------------------------// 函数功能:读取指定网页的内容,通过分析HTML文本获取指定区域内容// strUrl:指定网页地址// strTagName:指定要读取的HTML标签,如div或table// lTagIndex:指定要读取的索引,也就是第N个div或table//---------------------------------------String CrnGetHTMLAreaText(String strUrl, String strTagName, long lTagIndex){    String strResult("");    // 读取网页内容先,这里用的是Indy组件    TIdHTTP *ih = new TIdHTTP(NULL);    String strHtmlText;    try    {        strHtmlText = ih->Get(strUrl);    }    __finally    {        delete ih;    }    if(strHtmlText == "") return strResult;    // 初始化COM    CoInitialize(NULL);    // 创建接口,用以分析HTML文本    IHTMLDocument3 *spDoc = NULL;    CoCreateInstance(CLSID_HTMLDocument,                   NULL,                   CLSCTX_INPROC_SERVER,                   IID_IHTMLDocument3,                   (LPVOID *)&spDoc);    HRESULT hr;    if(spDoc)    {        IPersistStreamInit *pPersist = NULL;        hr = spDoc->QueryInterface(IID_IPersistStreamInit, (LPVOID *) &pPersist);        if(SUCCEEDED(hr))        {            IMarkupServices *pMarkSvr = NULL;            pPersist->InitNew();            hr = spDoc->QueryInterface(IID_IMarkupServices, (LPVOID *)&pMarkSvr);            if(SUCCEEDED(hr))            {                IMarkupContainer *pMkContainer = NULL;                IMarkupPointer *pMkStart = NULL;                IMarkupPointer *pMkFinish = NULL;                pMarkSvr->CreateMarkupPointer(&pMkStart);                pMarkSvr->CreateMarkupPointer(&pMkFinish);                hr = pMarkSvr->ParseString(WideString(strHtmlText),                        0, &pMkContainer, pMkStart, pMkFinish);                if(SUCCEEDED(hr))                {                    IHTMLDocument3 *pNewDoc = NULL;                    // 通过分析HTML文本获得新的接口                    pMkContainer->QueryInterface(IID_IHTMLDocument3, (LPVOID *)&pNewDoc);                    if(pNewDoc)                    {                        IHTMLElementCollection *pColl;                        // 获取所有的strTagName                        hr = pNewDoc->getElementsByTagName(WideString(strTagName), &pColl);                        if(SUCCEEDED(hr))                        {                            long lCount;                            hr = pColl->get_length(&lCount);                            // 定位到指定的标签处                            if(SUCCEEDED(hr) && lCount > lTagIndex)                            {                                VARIANT vTemp, vID;                                vID.vt = VT_UI4;                                vID.lVal = lTagIndex;                                // 63 63 72 75 6E 2E 63 6F 6D                                IDispatch *pDisp;                                hr = pColl->item(vID, vTemp, &pDisp);                                if(SUCCEEDED(hr) && pDisp)                                {                                    // 读取这个标签的文本内容                                    IHTMLElement *pElement;                                    hr = pDisp->QueryInterface(IID_IHTMLElement, (void **)&pElement);                                    if(SUCCEEDED(hr))                                    {                                        wchar_t *wszBuf;                                        pElement->get_innerText(&wszBuf);                                        strResult = wszBuf;                                        // 走到这一步就算成功鸟                                        pElement->Release();                                    }                                    pDisp->Release();                                }                            }                            pColl->Release();                        }                        pNewDoc->Release();                    }                    pMkContainer->Release();                    pMkStart->Release();                    pMkFinish->Release();                }                pMarkSvr->Release();            }            pPersist->Release();        }        spDoc->Release();    }    CoUninitialize();    return strResult;}//---------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){    String strUrl = "http://www.jzqyw.cn/company_content.php?shopid=30914";    // 读取这个网页的第9个表格的文本内容    Memo1->Lines->Text = CrnGetHTMLAreaText(strUrl, "table", 8);} 


[解决办法]
请问高手如何用 CppWebBrowser 写程序进行自动测试呢?
我试过, 先用WebBrowser读取指定的网页内容,然后通过IHTMLDocument2接口分析HTML内容.
然后让程序填表单数据, 提交
pFormElement->submit(); //成功

但如何在提交成功后获得新的一页的HTML内容, 然后让程序再填新的数据, 再次提交...... 直到完成最后一页任务呢?
在第一页数据成功提交后, 网站已返回第二页内容, 但我试用如下方法取新内容, 不行, Memo1 中显示的还是原来第一页的内容:
CppWebBrowser1->Update();
pDisp = CppWebBrowser1->Document;
pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc2);
pDoc2->get_body(&body);
body->get_outerHTML(&source) ;
Memo1->Text=AnsiString(source);

热点排行