500分求HTML编程实例!取IE内核浏览器中显示的所有文字,替换某些字符串后,再显示!

TianChong 2005-12-31 07:52:53
本人想实现以下功能:
程序在后台运作,监视所有打开的,基于IE内核的浏览器(如IE,MYIE等,当然能包括所有浏览器更好!),当这类浏览器要打开某个网页时,本程序要在其显示内容之前取得其正常情况下本应显示的文本内容(图片、动画等一律忽略),然后分析是否有某些要替换的字符,(例如:改“机票5折起”为“*****”),有上百成千个词句要被修改,作完上述修改后的文本内容才让浏览器显示。
总之就是要监控所有的网页,如果发现其显示的内容中包含指定不充许显示的词组,则自动更换为用户指定的字符串,最终内容是要重新显示在浏览器中。
如果在启动本程序之前,某一个网页已打开,也能在启动后处理该网页。

希望能有一个简单完整的例程(VC++版本),谢谢各位高人。本人一定高分奉送,如果有请发送至onlyceo@163.com,请注明(源程序)。
...全文
553 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolzdp 2006-01-08
  • 打赏
  • 举报
回复
其它浏览器也能实现?opera,firefox,mozalia?
TianChong 2006-01-07
  • 打赏
  • 举报
回复
由于没人帮我实现或基本实现所述功能,即最初就提出的问题:
程序在后台运作,监视所有打开的,基于IE内核的浏览器(如IE,MYIE等,当然能包括所有浏览器更好!),当这类浏览器要打开某个网页时,本程序要在其显示内容之前取得其正常情况下本应显示的文本内容(图片、动画等一律忽略),然后分析是否有某些要替换的字符,(例如:改“机票5折起”为“*****”),有上百成千个词句要被修改,作完上述修改后的文本内容才让浏览器显示。
......
希望能有一个简单完整的例程(VC++版本)......

----------------------------------------------------------------------------------
最后还是自己在书城找到资料实现的,因此,得主空缺,只能送出本贴分数,本人开贴给分从不失信,并且结贴快捷不拖拉,希望下次还能得到各位的鼎力相助,必以高分相赠(前提是比较正确完整的解答了问题)。谢谢各位!本人QQ 30101希望可以交流一下。加入者请注明,VC或PB或CSDN,欢迎你们!

TianChong 2006-01-07
  • 打赏
  • 举报
回复
因为大家都不肯给出清楚的、实际可运行的代码,今天只好专门到书城翻资料,回来又捣和了一晚上,搞定,结贴!!!来者有分!!!!!!!!!
coolzdp2 2006-01-05
  • 打赏
  • 举报
回复
up一下,顺便给我的问题放个链接:-)

http://community.csdn.net/Expert/topic/4499/4499810.xml?temp=.7329676
TianChong 2006-01-05
  • 打赏
  • 举报
回复
求:
Browser Helper Objects: The Browser the Way You Want It
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebgen/html/bho.asp)

文中所提到的示例程序的全部源程序(可顺利编译),本人实在是查询不到哪里有下载,请分享一下,EMAIL:OnlyCEO@163.com,谢谢。
蒋晟 2006-01-05
  • 打赏
  • 举报
回复
>使用IE内核的,其本身就先天对BHO支持了
你有没有自己写过使用IE内核的览器?自己打开MFCIE示例试试看。
P.S. 在输出之前要把BSTR转成LPCTSTR
TianChong 2006-01-04
  • 打赏
  • 举报
回复
另外,不需要对方实现BHO接口,只要是使用IE内核的,其本身就先天对BHO支持了,这个不用担心,另外给你看一下实现的效果图,当然,图中显示的是网源代码而非网页文本,不过只要取得源代码了,要取得文本也很简单,问题是我现在连源代码都取不到.

http://msdn.microsoft.com/library/en-us/dnwebgen/html/bhofig3.gif
widowss 2006-01-04
  • 打赏
  • 举报
回复
是啊,满奇怪的,期待蒋老大再次出手
TianChong 2006-01-04
  • 打赏
  • 举报
回复
TO:jiangsheng(蒋晟.Net[MVP])

回为:http://www.vckbase.com/document/viewdoc/?id=1446所示的例子是控制台的,所以我现在测试也是基于他的代码作修改的,因此在控制台上输出是没有问题的,你可以下载来试一下,关键是我作出上述修改后,不能达到预期的效果,实在不得其法,请您帮忙诊断一下,十分感谢.

下面是我最新的代码片段:
//已取得pIHTMLDocument2指针:
HRESULT hr;
CComBSTR bstrTitle;
pIHTMLDocument2->get_title( &bstrTitle ); //取得文档标题

///////////////////////////////////测试行
CComPtr<IHTMLElement> m_pBody;
hr =pIHTMLDocument2->get_body(&m_pBody);
if ( FAILED( hr ) )
{
cout << _T("获取IHTMLBodyElement 错误") << endl;
return;
}
else
{
BSTR bstrHTMLText;
hr = m_pBody->get_outerHTML(&bstrHTMLText); //此处应已取得了原代码
//LPTSTR psz = new TCHAR[SysStringLen(bstrHTMLText)];
//lstrcpy(psz, OLE2T(bstrHTMLText));

cout << _T("获取body成功!") <<_T("网页的文本内容(A)=")<< *bstrHTMLText << endl; //我同时打开十几个网页,能正确取得打开的网页数,且输出的bstrHTMLText指针地址也是随着不同的网页而变化的,可是其输出值却总是等于"13",不知是何故?按理来说网页不同其值应该是不同的,而且也不可能是"13"这么短的内容.
}
Atry 2006-01-02
  • 打赏
  • 举报
回复
首先IHTMLDocument3::get_documentElement
然后IHTMLElement::QueryInterface 变成IHTMLDOMNode ,
然后遍历,如果有IHTMLDOMTextNode的节点,就用get_data属性得到文字,然后翻译

蒋晟 2006-01-02
  • 打赏
  • 举报
回复
1 cout?这不是控制台程序,默认不显示输出的。
2 上述的例子对你所要求的第三方软件不是总有效。使用IE内核的浏览器很少实现BHO接口的,更别说FireFox之类的浏览器跟本就不是IE内核了。
TianChong 2006-01-02
  • 打赏
  • 举报
回复
本人已取得IHTMLDocument2指针,但是在下面的测试中却无法取得网页中文本内容,测试代码如下:

//这里是如何取得IHTMLDocument2指针的代码,详见后面说明.
//...
//取得IHTMLDocument2指针后
CComBSTR bstrTitle;
pIHTMLDocument2->get_title( &bstrTitle ); //这样可以取得文档标题,成功
cout << OLE2CT( bstrTitle ); //这样可输出文档标题,成功

//但是...下面的步骤里,就无法取得文本内容并显示了:
CComQIPtr< IHTMLElement > pIHTMLEle;
hr =pIHTMLDocument2->get_body(&pIHTMLEle);
if ( FAILED( hr ) )
{
cout << _T("获取body IHTMLElement 错误") << endl;
return;
}
else
{
BSTR p;
pIHTMLEle->get_innerText(&p); //成功
cout << _T("获取body 成功!") <<endl; //成功
cout<<_T("网页的文本内容(A)=")<< _T("此处想让p输出文本,但好像输出失败.请指教! ") << endl; //编译运行都是顺利的,但此句未能达到期望的效果,失败.
}

////////////////////////////////////////////
//下面的也是一种方案,不过要用到上面已取得的pIHTMLEle,同样get_text成功,但也无法输出文本啊,求教!!!!!!!!
CComQIPtr<IHTMLBodyElement> spBody(pIHTMLEle);
if (spBody != NULL)
{
spBody->put_bgColor(CComVariant( "red" )); //可改背景色,表明离成功已不远
CComVariant vText;
spBody->get_text(&vText); //取得值,成功
cout <<endl<<_T("网页的文本内容(B)=")<< vText.bstrVal<<_T("输出的根本不是文本"); //此行也算失败
}

//请大家帮帮忙,诊断一下为何不能成功.谢谢.

//以上代码参考了:http://www.vckbase.com/document/viewdoc/?id=1446
//其上很清楚的列出了如何取得IHTMLDocument2指针,故取得IHTMLDocument2指针的步骤就省略了
//上述代码紧附在下面代码之后:
void EnumForm( IHTMLDocument2 * pIHTMLDocument2 )
{
if( !pIHTMLDocument2 ) return;
EnumFrame( pIHTMLDocument2 ); //递归枚举当前 IHTMLDocument2 上的子框架fram
//这里接上面的测试代码...

//后面原有代码不变...
}

Atry 2006-01-01
  • 打赏
  • 举报
回复
用BHO
http://www.cnblogs.com/hbifts/articles/24265.html
coolzdp 2006-01-01
  • 打赏
  • 举报
回复
HRESULT IHTMLDocument2::get_all(IHTMLElementCollection **p);

IHTMLElementCollection::toString Method

用这俩看看
coolzdp 2006-01-01
  • 打赏
  • 举报
回复
楼主我也是水平有限,边学边用的。你看这个应该可以取到所有的文本。

IHTMLDocument2::body Property Internet Development Index

--------------------------------------------------------------------------------

Retrieves an interface pointer to the document's body object.

Syntax

HRESULT IHTMLDocument2::get_body(IHTMLElement **p);
Parameters

p
Address of a pointer to the IHTMLElement interface of the body object.
Return Value

Returns S_OK if successful, or an error value otherwise.

至于替换我可是一点思路都没有。
是怎么个替换法?载入前就替换掉还是显示出来然后刷新页面替换?
要是后者我想的就是生成一个临时文件载入。不过觉得很不好。
前者我啥都不会(直接网络编程???抓包???)还是问上面两个老大吧。
蒋晟 2006-01-01
  • 打赏
  • 举报
回复
简单完整的例程?这类东西一般是通过路由器硬件实现……
TianChong 2006-01-01
  • 打赏
  • 举报
回复
TO:coolzdp(▄︻┻┳═一[山高月不小,水落石不出])

你给的例子很好,但是没有说清楚以下问题,希望各位大侠能帮助解答:
1.只取得了所有的表单及其内容,但是并没有取得非表单上的文本,例如,本页中显示的大量的文字它没有取到,查了一下资料也不知如何入手,总之就是要将页面上显示的所有文本都能列出来(即取得其内容)例如我们现在发贴、回帖的内容,及本面左侧所显示栏目中的内容.

2.取得这些文本内容后,还要能替换回去,令网页内容发生改变.这个我也不会处理.例子中也没提及.goodboyws(深夜不眠者)提供的我一时还没看明白.

例如:我现在回贴的内容,要被替换成:"新回复的内容",上面贴子内容都改为:"之前的内容",这要如何做到?


goodboyws(深夜不眠者):你的也不错,不过资料太散了,还是全E文的,对我是种考验-_-||,希望能比较有条理的用中文讲解一下流程.

因为我是要对第三方软件,即别人的浏览器进行文本替换,所有举例子时请注意这一点.

问题一旦解决,即给高分!!!来者有分!
goodboyws 2005-12-31
  • 打赏
  • 举报
回复
修改网页文本用 m_pBody->put_outerHTML即可
goodboyws 2005-12-31
  • 打赏
  • 举报
回复
http://www.microsoft.com/mind/0598/browhelp.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebgen/html/bho.asp
上述文章和代码在Msdn光盘上都有,搜索标题即可
修改代码用 m_pBody->put_outerHTML即可
coolzdp 2005-12-31
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1446

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧