Delphi TWebBrowser[5] 获取含框架的网页完整html源码 及多个框架(跨域)的方法
Delphi TWebBrowser[5] 获取含框架的网页完整html源码 及多个框架(跨域)的方法
1、获取html源码的常规方法:
1 | (WebBrowser1 . Document as IHtmlDocument2).body . outerHtml; |
2、获取含框架frame的完整html源码(<body>之外如<head>)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var ole_index, oleObj: OleVariant; i: integer ; begin // if WebBrowser1.Busy then Exit; //网页加载中,退出。 with Memo1 . Lines do begin //获取主框架网址及网页源码 Clear; Add(WebBrowser1 . OleObject . document . url); Add(WebBrowser1 . OleObject . document . documentElement . outerHTML); Add( ' ' ); Add( ' ' ); //添加空行 end ; //循环获取每一个子框架网址及网页源码 for i := 0 to WebBrowser1 . OleObject . document . frames . length - 1 do begin ole_index := i; oleObj := WebBrowser1 . OleObject . document . frames . item(ole_index); with Memo1 . Lines do begin Add(oleObj . document . url); Add(oleObj . document . documentElement . outerHtml); Add( ' ' ); Add( ' ' ); //添加空行 end ; end ; end ; |
3、多个框架(跨域)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | Uses MsHtml, ActiveX<br><br> var i: Integer ; ole_index: OleVariant; FrameDis: IDispatch; FrameWin: IHtmlWindow2; psi:IServiceProvider; frameb: IWebBrowser2; pPersist: IPersistStreamInit; ss: TStringStream; str1, str2: String ; begin if WebBrowser1 . Busy then Exit; Memo1 . Lines . Clear; //获取主网页网址 Memo1 . Lines . Add(WebBrowser1 . OleObject . document . url); //获取主网页源码 Memo1 . Lines . Add(WebBrowser1 . OleObject . document . documentElement . outerHTML); //添加空行 Memo1 . Lines . Add( ' ' ); for i := 0 to WebBrowser1 . OleObject . document . frames . length - 1 do begin ole_index := i; FrameDis := (WebBrowser1 . Document as IHtmlDocument2).frames . item(ole_index); FrameDis . QueryInterface(IID_IHTMLWindow2, FrameWin) ; if FrameWin = nil then Continue; FrameWin . QueryInterface(IServiceProvider, psi); if psi = nil then Continue; psi . QueryService(IID_IWebBrowserApp,IID_IWebBrowser2,frameb); if frameb= nil then continue; frameb . Document . QueryInterface(IPersistStreamInit, pPersist); if pPersist = nil then Continue; //获取框架页网址 Memo1 . Lines . Add((frameb . Document as IHtmlDocument2).url); ss := TStringStream . Create( '' ); try //获取框架页源码 if Succeeded(pPersist . Save(TStreamAdapter . Create(ss), True )) then begin str1 := ss . DataString; str2 := Utf8ToAnsi(str1); //有些网页使用UTF-8编码方式,不进行转换中文会乱码 if str2 = '' then Memo1 . Lines . Add(str1) else Memo1 . Lines . Add(str2); end ; finally FreeAndNil(ss); end ; Memo1 . Lines . Add( ' ' ); //添加空行 end ; end ; |
创建时间:2020.11.23 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报