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

指定的区域

帮顶

获取 一个 固定 的 html 内容 如: www.dfsdf.com/sdfsad.html
这个显示的文字 部分 内容  http://www.jzqyw.cn/company_content.php?shopid=30914(举例随便找的) 现实中就是一个 固定的 html 通过C++Builder实现 所谓的区域 就是 显示 的 文字部分 内容 (以上面的地址 为例)

各位 帮帮忙 很急!!!很急!!!很急!!!

先用WebBrowser或IdHTTP读取指定的网页内容,然后通过IHTMLDocument2接口分析HTML内容,至于指定的区域,由于不同的网页中结构以及元素不同,这一点很难做到通用。如果是读取一个结构不变化的网页,这个好办。看你的需求,需要代码就吱一声,顺便给出测试用的网页地址。

妖哥 。。还是 把代码整出来吧 谢谢 谢谢

急用 急用。。。。。。

网页结构 固定不变 用table 做成的

晚上回来给你代码。

先谢妖哥了

摇哥 我等你的代码 等的好辛苦

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)

这两天事情多,有些忙不过来,代码写了一半,尚未调试完,如果今天晚上没有应酬,应该可以帮你搞定,最晚明天代码Post过来。
设计思想是用IdHTTP读取网页数据,经过接口转化,利用IHTMLDocument2或IHTMLDocument3定位到指定的表格,读取文字内容。
实在抱歉。我答应了别人的事,不愿意辜负别人期望。

用CppWebBrowser

通过 DOM 解析 HTML 中的内容,可针对每个节点(区域)进行各种操作!

我来了!!!这两天事情太多,忙里抽闲才调试完这一段代码。以下代码在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);

做WEB游戏外挂用的?

妖兄,不知道您的Spy4Win中获取指定IE页面的代码该如何写啊?
Spy4Win功能太强大了,都可以看到页面中鼠标下面一小部分的代码了,不知道妖兄能否给些提示代码?
多谢

强贴留名。

楼主貌似已失踪,郁闷中。。。

@faretel:
提交成功后,重新Nav到提交前的页面,填写数据,提交,再重复这个步骤。

@dawnsong:
Spy4Win中IE页面探测功能主要是通过IHTMLDocument2接口来完成的,多看看mshtml.hpp文件对你有帮助。