我正在使用name
Winforms
控件从下面链接的站点收集视频剪辑的链接。
但是,当我逐元素滚动时,找不到WebBrowser
标签。
<video>
使用后很快
void webBrowser_DocumentCompleted_2(object sender, WebBrowserDocumentCompletedEventArgs e)
{
try
{
HtmlElementCollection pTags = browser.Document.GetElementsByTagName("video");
int i = 1;
foreach (HtmlElement link in links)
{
if (link.Children[0].GetAttribute("className") == "vjs-poster")
{
try
{
i++;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
} // Added by edit
}
我已经返回0
我需要调用任何ajax吗?
答案 0 :(得分:2)
您链接的网页包含IFrames。
IFrame
包含自己的HtmlDocument。到目前为止,您只解析主Document容器。
因此,您需要解析其他一些HtmlElements
的{{1}}标记。
Web页面框架列表由WebBrowser.Document.Window.Frames属性引用,该属性返回一个HtmlWindowCollection。
集合中的每个HtmlWindow都包含自己的Frame
对象。
大多数时候,我们需要解析HtmlDocument
集合中的每个Document
,而不是解析WebBrowser
返回的HtmlWindow.Document
对象属性;除非,当然,除非我们已经知道所需的元素是主文档或另一个已知的Frames
的一部分。
一个示例(与当前任务有关):
注意:
记住网页可能由Frames / IFrames中包含的多个Documents组成,如果使用Frame
多次引发该事件,我们不会感到惊讶。
ReadyState = WebBrowserReadyState.Complete
完成加载后,每个框架的Document
将引发事件。
WebBrowser
集合中每个框架的HtmlDocument
。Document.Window.Frames
HtmlElements
。 注意:
由于Attibute
事件被多次引发,因此我们需要验证DocumentCompleted
属性值也没有被多次存储。
在这里,我使用的是一个支持自定义类,该类包含所有收集的值以及每个引用Link的HashCode(在此依赖于HtmlElement
的默认实现)。
每次解析Document时,我们都会比较其Hash值来检查是否已经存储了一个值。
注意:
解析GetHasCode()
时,不可避免地会引发一些特定的异常:
1)UnauthorizedAccessException:某些框架无法访问。
2)InvalidOperationException:某些元素/后代无法访问。
我们没有什么可以避免的:元素不是HtmlWindowCollection
,当我们尝试访问它们的属性的 any 时,它们只是抛出了这些异常(基类的错误设计) )。
在这里,我只是捕捉并忽略了这些特定的异常:我们知道最终我们会获得它们,我们无法避免,继续前进。
null