C# webBrowser 获取框架内Html页面内容

来源:互联网 发布:杭州富谦网络 编辑:程序博客网 时间:2024/05/01 19:59










利用webBrowser获取页面比较简单,MSDN下有示例,在这里不必多说。

可是一些 HTML 文档由“框架”构成,或可以存放它们自己独特 HTML 文档的窗口。使用框架可以轻松地创建 HTML 页面,其中一页或多页在其他框架持续更改它们内容的同时保持静态,例如导航栏。

HTML 作者可以采用以下两种方法之一创建框架:

  • 使用 FRAMESET 和 FRAME 标记,创建固定窗口。

- 或 -

  • 使用 IFRAME 标记,创建可以在运行时重新放置的浮动窗口。

  1. 因为框架包含 HTML 文档,它们在文档对象模型 (DOM) 中表示为窗口元素和框架元素。

  2. 当通过使用 HtmlWindow 的框架集合访问 FRAME 或 IFRAME 标记时,也就是检索对应于此框架的窗口元素。这里指框架的所有动态属性,例如它的当前 URL、文档和大小。

  3. 使用 HtmlWindow、Children 集合或 GetElementsByName 或 GetElementById 等方法的 WindowFrameElement 属性访问 FRAME 或 IFRAME 标记时,也就是在检索框架元素。这里指框架的静态属性,包括原始 HTML 文件中指定的 URL。

框架和安全

对框架的访问因为托管 HTML DOM 实施称为“跨框架脚本撰写安全”的安全措施的事实而比较复杂。如果文档包含的 FRAMESET 中的两个或多个 FRAME 在不同域中,这些 FRAME 互相之间不能交互。换言之,显示网站内容的 FRAME 无法访问承载第三方站点(例如 http://www.adatum.com/)的 FRAME 中的信息。在 HtmlWindow 类级别实现这种安全。可以获取关于承载另一个网站的 FRAME 的一般信息(例如它的 URL),但无法访问它的 Document 或更改它的宿主 FRAME 或 IFRAME 的大小或位置。

此规则也适用于使用 Open 和 OpenNew 方法打开的窗口。如果您打开的窗口所在域不同于在 WebBrowser 控件中承载的页面的域,您将无法移动该窗口或检查它的内容。当您使用 WebBrowser 控件显示一个与部署基于 Windows 窗体的应用程序所用网站不同的网站时,也将强制执行这些限制。如果使用 ClickOnce 部署技术从网站 A 安装应用程序,而使用 WebBrowser 显示网站 B,您将无法访问网站 B 的数据。

有关跨站点脚本撰写的更多信息,请参见 About Cross-Frame Scripting and Security(关于跨框架脚本撰写和安全) (http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om /xframe_scripting_security.asp)。

请参见其他资源使用托管 HTML 文档对象模型
FRAME 元素 | frame 对象

1.获取frame的源文件

MessageBox.Show(webBrowser1.Document.Window.Frames["main"].Document.Body.InnerHtml);

2.获取frame的HTMLDocument接口

HTMLDocument doc = (HTMLDocument)webBrowser1.Document.DomDocument;
object j;
for (int i = 0; i < doc.parentWindow.frames.length; i++)
{
j = i;
HTMLWindow2Class frame = doc.parentWindow.frames.item(ref j) as HTMLWindow2Class;
if (frame.name == "main")
{                   
MessageBox.Show(frame.document.title);                    
}
}      

3.获取frame的IHTMLDocument2接口

IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.Window.Frames["main"].Document.DomDocument;

4.取得frame中被点击的连接

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
string url = webBrowser1.Document.Window.Frames["main"].Document.ActiveElement.GetAttribute("src");
}



使用WebBrowser控件获取含框架的网页的完整HTML代码  

2010-12-06 18:31:00|  分类: Delphi程序设计|举报|字号 订阅

使用WebBrowser控件获取网页源码的方法,网上有很多介绍,但绝大多数的人都是使用以下的方法获取:

(WebBrowser1.Document as IHtmlDocument2).body.outerHtml;

我以前也是这么用的,这种方法的美中不足就是只能获取网页<body>与</body>之间的网页源码,而<body>之外如<head>部分的网页源码就获取不到了,本人在网上搜了很久,终于找到解决方法。好的东西不敢独享,现将这种方法共享出来:

procedure TForm1.Button1Click(Sender: TObject);
var
  ole_index, oleObj: OleVariant;
  i: integer;
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(' '); Memo1.Lines.Add(' '); //添加空行
  //循环获取每一个子框架网址及网页源码
  for i := 0 to WebBrowser1.OleObject.document.frames.length - 1 do
  begin
    ole_index := i;
    oleObj := WebBrowser1.OleObject.document.frames.item(ole_index);
    Memo1.Lines.Add(oleObj.document.url);
    Memo1.Lines.Add(oleObj.document.documentElement.outerHtml);
    Memo1.Lines.Add(' '); Memo1.Lines.Add(' '); //添加空行
  end;
end;




0 0