用c++Builder 如何获取html内容
用c++Builder 如何获取html内容
指定的区域
[解决办法]
//通过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中测试通过
#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);