您链接的网页包含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<Movielink> movieslinks = new List<Movielink>();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<HtmlElement>().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 }}


