本帖最后由 swlove 于 2010-05-21 15:08:43 编辑

解决方案 »

  1.   

    用WebBrowser1不讓它下載而獲利它的文本內容,似乎行不通要用 WebBrowser,你的
      s := WebBrowser1.OleObject.document.parentWindow.content.innerText;
      Memo1.Text := s; //这是 content 标签中的文本就得寫在DownloadComplete事件中 並且WebBrowser1.ReadyState=3你所謂的『直接显示文本』也不可能不下載就直接能顯示的,就算用IDHTTP或者IEDownload1也得有個下載過程,然後再提取你要的吧如果你不下載就直接把那個網頁中的文本給SHOW出來了,請一定要通知我一聲。
      

  2.   

    顶楼上,网页访问使用的是UDP协议,要下载内容才能显示。建议将WebBrowser1网页保存到内存,再提取需要的内容显示。
      

  3.   

    Navigate事件和其它事件不是同步的,类似多线程。触发此事件后不能进行 WebBrowser1.OleObject.document操作,因为Navigate事件未完成呢。
    中加加一句:
    WebBrowser1.Navigate(Edit1.Text);
    while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
            application.ProcessMessages; 
    s := WebBrowser1.OleObject.document.parentWindow.content.innerText;
      Memo1.Text := s; //这是 content 标签中的文本
      

  4.   

    谢谢楼上各位大侠的答复
    正如yshuui大侠所说的,比如我想过滤下面页面中的源代码,或者禁止执行整个网页中的script,那该如何做呢 ?
    谢谢<center><script type="text/javascript"><!--
    google_ad_client = "pub-2861391824702976";
    /* 336x280, 创建于 10-3-8 */
    google_ad_slot = "2199590706";
    google_ad_width = 336;
    google_ad_height = 280;
    //-->
    </script>
    <script type="text/javascript"
    src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </script></center>
      

  5.   

    建議 用EmbeddedWB 簡單快捷把下載這些全禁了,顯示就快很多了
    [DownloadImages,DownloadVideos,DownloadBGSounds,DontExecuteScripts,DontExecuteJava,DontDownloadFrame]
      

  6.   

    >>>网页访问使用的是UDP协议???长见识啊.
      

  7.   

    那我换一个角度请教:使用TWebbrowser或者EmbeddedWB,如何才能做到只显示指定标签内的文本呢 ?页面可以下载,但整个页面就不显示给用户看到请问该如何做呢 ?
      

  8.   

    通过HTTP协议先读取网页文本,然后用IHTMLDocument接口分析网页文本.然后将需要显示的部分动态的更新到WebBrowser中.
      

  9.   

    所有在电脑上看到的东西都是画出来的结果。先 get/post 到网页文本,然后分析,提取需要的。
      

  10.   

    其实过滤难度还是挺大的,一些网页浏览器使用了过滤。想做的比较完美,真的需要分析HTTP协议和数据包,比如网页视频下载。
    用EmbeddedWB确实可以定制过滤,如果不想使用控件,可以参考一下它的代码,写到自己的程序里。
    没有仔细去研究,你自己看一下吧。
      

  11.   

    var
    imgs: OleVariant;
    begin
    imgs := WebBrowser1.OleObject.Document.getElementsByTagName('img');
    for i := 0 to imgs.Length - 1 do
    begin
    imgs.item(i).src:=....end;
    end;
    你试试把img换成ALL行不,然后自己分析什么是需要的。或者
    var 
       doc:IHTMLDocument2; 
       all:IHTMLElementCollection; 
       item:OleVariant; 
      begin 
       doc:=WebBrowser1 .Document as IHTMLDocument2; 
       all:=doc.all;             //doc.Links亦可 
       len:=all.length; 
       for i:=0 to len-1 do begin 
                  ...自己分析吧
       end; 
      end; 
      

  12.   


    yshuui兄,按照你代码的意思是,先把网页下载回来,显示在WebBrowser1,再进行过滤,然后提取自己想要的 ?但我的目的是,把网页下载回来后,不要显示在WebBrowser1上,先进行提取,再把提取出来的文本显示再WebBrowser1上
      

  13.   

    我只是想显示“content 标签中的文本”,记得有个“小说下载阅读器”的软件,它就能很好的只显示小说文本或者小说内容的图片,不知道他是怎么实现的
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Edit1.Text:='http://www.3ghxw.com/files/article/html/9/9547/2879756.html';
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      s:string;
    begin
      WebBrowser1.Navigate(Edit1.Text);
      s := WebBrowser1.OleObject.document.parentWindow.content.innerText;
      Memo1.Text := s; //这是 content 标签中的文本
    end;
      

  14.   

    我用delphi曾经做个一个图片搜索的软件,用ICS组件,用 get/post 的方法,先得到搜索结果的页面,然后解析 html 标签的规则,所有图片链接就出来了,然后用线程下载图片。所有过程都根本不用通过浏览器,显示缩略的组件用 TMS 组件包。我认为和你需要的文本内容是一个道理的,只是算法的效率高低而已。不知道这样的提示你明白不?或者最简单的说:和一些播放器的歌词下载是一个道理。你见过歌词下载通过浏览器后再下载么?没有的吧。
      

  15.   

    在程序员联合开发网找到几个例子,可能有帮助,可惜下载不了Extract 从网页中提取内容,取出各种标记, 留文本 生成 文件
    http://www.pudn.com/downloads126/sourcecode/others/detail533054.html WebPickUp 将网页上的文字提取下来保存在本地数据文件的工具
    http://www.pudn.com/downloads79/sourcecode/windows/file/detail305814.html有没有人有这个网站的账号?谢谢
      

  16.   

    使用DELPHI采集网页内容的源代码
    http://www.pudn.com/downloads49/sourcecode/windows/network/detail169204.html
      

  17.   

    方法是搞出来了,但感觉上有点怪怪的...
    期待高手更完美的解决方法
    我的代码如下,思路是利用 IXMLHTTPRequest 获取网页源代码,在调用函数GetStr截取需要的代码
    之所以不用IndyHTTP,是因为IndyHTTP有些网页的源代码获取不到uses  msxml;//从网页源文件中获得指定标签间的代码function TForm1.GetStr(StrSource, StrBegin, StrEnd: string): string;
    var
      in_star, in_end: integer;
    begin
      in_star := AnsiPos(strbegin, strsource) + length(strbegin);
      in_end := AnsiPos(strend, strsource);
      Result := copy(strsource, in_star, in_end - in_star);
    end;//信息列表点击procedure TForm1.btn1Click(Sender: TObject);
    const
      url = 'http://www.xxx.com';
    var
      req: IXMLHTTPRequest;
      StrStream: TStringStream;
      SetNoteStr: string;
    begin
         //利用 IXMLHTTPRequest 获取网页源代码,在调用函数GetStr截取需要的代码
          req := CoXMLHTTPRequest.Create;
          req.open('Get', url, False, EmptyParam, EmptyParam);
          req.send(EmptyParam);
          SetNoteStr := GetStr(req.responseText, '</script></center>', 'document.body.oncopy=function');//获取标签直接的代码
          StrStream := TStringStream.Create(SetNoteStr);
          try
            StrStream.Position := 0;
            (WebBrowser.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));//直接写入WebBrowser
          finally
            StrStream.Free;
    end;
      

  18.   

    前些天你發問時,我就用tembeddedwb中的 UILess1,添加一個通過標籤ID就能取值的函數。但發現會產生臨時文件,還會下載圖片。感覺也不太可取。把你這種方法先轉到我那帖子里去。有需要再一一研究
      

  19.   

    其實用idhttp來get這種靜態頁面是很方便的。
      

  20.   

    赞同...
    一开始我也是用idhttp來get,但试了不少页面,有些不行,所以才改成IXMLHTTPRequest。
      

  21.   

    另请教一下,devhp兄有试过用用WebService: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 来获取地方的天气预报吗 ?
    我找了个例子,按照他的提示做,提示“未将对象引用设置到对象的实例”。
    后来又添加了以下代码,还是不行
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      HTTPRIO1.Service := 'WeatherWebService';
      HTTPRIO1.Port := 'WeatherWebServiceSoap';
      HTTPRIO1.WSDLLocation := 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl';
    end; 1.用WSDL Import导入http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
    2.生成一个VCL工程,向界面添加HTTPRIO(WebService栏),设置好其WSDL、Service、Port
    3.添加按钮
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Wp:WeatherWebServiceSoap;
      AOS:ArrayOfString;
      I:Integer;
    begin
      Wp:=HTTPRIO1 as  WeatherWebServiceSoap;
      AOS:=wp.getWeatherbyCityName('石家庄');//此处写成一个变量
      for I:=Low(AOS) to High(AOS) do
      begin
         showmessage(AOS[I]);
      end;
    end;
    4.运行