获取html中的iframe,如何在Frames / IFrames中获取HtmlElement值?

小编典典

您链接的网页包含IFrames。

一个IFrame包含它自己的HTMLDocument。到目前为止,您只解析主Document容器。

因此,您需要解析HtmlElements其他标签Frame。

Web页面框架列表由WebBrowser.Document.Window.Frames属性引用,该属性返回HtmlWindowCollection。集合中的

每个HtmlWindow都包含自己的HtmlDocument对象。

相反解析的Document被返回的对象属性WebBrowser,我们大部分的时间,需要分析每个HtmlWindow.Document中Frames收集;

除非,当然,除非我们已经知道所需的元素是主文档或其他已知文档的一部分Frame。

一个示例(与当前任务有关):

订阅WebBrowser控件/类的DocumentCompleted事件。

检查WebBrowser.ReadyState属性以验证是否完全加载了Document。

注意:

请记住,网页可能是由Frames / IFrames中包含的多个Document组成的,如果使用多次引发事件,我们不会感到惊讶ReadyState =

WebBrowserReadyState.Complete。加载完毕后,

每个Frame Document都会引发事件WebBrowser。

使用Frame.Document.Body.GetElementsByTagName()方法解析集合HtmlDocument中每个Frame的。Document.Window.Frames

HtmlElements Attibute使用HtmlElement.GetAttribute方法提取。

注意:

由于DocumentCompleted事件引发多次,因此我们需要验证HtmlElement属性值也没有存储多次。

在这里,我使用的是一个支持自定义类,该类包含所有收集的值以及每个引用Link的HashCode(此处依赖的默认实现GetHasCode())。

每次解析文档时,我们都会比较其哈希值,以检查是否已存储值。

当我们确认已找到重复的哈希时,停止分析:框架文档元素已被提取。

注意 :

在解析时HtmlWindowCollection,不可避免地会引发一些特定的异常:

1)UnauthorizedAccessException:某些框架无法访问。

2)InvalidOperationException:某些元素/后代无法访问。

我们没有什么可以避免的:元素不是null,当我们尝试访问它们的 任何 属性(基类的不良设计)时,它们只会抛出这些异常。

在这里,我只是捕捉并忽略了这些特定的例外:我们知道最终将获得它们,我们无法避免,继续前进。

public class MovieLink

{

public MovieLink() { }

public int Hash { get; set; }

public string VideoLink { get; set; }

public string ImageLink { get; set; }

}

List moviesLinks = new List();

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)

{

if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

var documentFrames = webBrowser1.Document.Window.Frames;

foreach (HtmlWindow Frame in documentFrames)

{

try

{

var videoElement =

Frame.Document.Body

.GetElementsByTagName("VIDEO").OfType().FirstOrDefault();

if (videoElement != null)

{

string videoLink = videoElement.Children[0].GetAttribute("src");

int hash = videoLink.GetHashCode();

if (moviesLinks.Any(m => m.Hash == hash))

{

// Done parsing this URL: remove handler or whatever

// else is planned to move to the next site/page

return;

}

string sourceImage = videoElement.GetAttribute("poster");

moviesLinks.Add(new MovieLink() {

Hash = hash, VideoLink = videoLink, ImageLink = sourceImage

});

}

}

catch (UnauthorizedAccessException) { } // Cannot be avoided: ignore

catch (InvalidOperationException) { } // Cannot be avoided: ignore

}

}

2020-05-19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值