Wil*_*l V 6 .net c# webbrowser-control winforms
我正在使用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
}
Run Code Online (Sandbox Code Playgroud)
使用后不久
HtmlElementCollection pTags = browser.Document.GetElementsByTagName("video");
Run Code Online (Sandbox Code Playgroud)
我已经返回 0
我需要调用任何ajax吗?
您链接的网页包含IFrames。
AnIFrame
包含它自己的HtmlDocument。到目前为止,您只解析主 Document 容器。
因此,您需要解析HtmlElements
其他一些Frame
.
Web Page Frames 列表由WebBrowser.Document.Window.Frames属性引用,该属性返回一个HtmlWindowCollection。集合中的
每个HtmlWindow都包含它自己的HtmlDocument
对象。
相反解析的Document
被返回的对象属性WebBrowser
,我们大部分的时间,需要分析每个HtmlWindow.Document
中Frames
收集; 当然,除非我们已经知道所需的元素是主文档的一部分或另一个已知的Frame
.
一个例子(与当前任务相关):
注意:
请记住,一个网页可能由包含在 Frames/IFrames 中的多个文档组成,如果使用ReadyState = WebBrowserReadyState.Complete
.
每个 FrameDocument
将在WebBrowser
加载完成后引发事件。
HtmlDocument
中每个 Frame 的。Document.Window.Frames
HtmlElements
Attibute
使用HtmlElement.GetAttribute方法提取。注意:
由于DocumentCompleted
事件被多次引发,我们需要验证一个HtmlElement
Attribute 值是否也没有被多次存储。
在这里,我使用了一个支持自定义类,它保存所有收集到的值以及每个引用链接的 HashCode(在这里,依赖于 的默认实现GetHasCode()
)。
每次解析 Document 时,我们都会检查一个值是否已经存储,并比较它的 Hash。
注意:
在解析 时HtmlWindowCollection
,不可避免地会引发一些特定的异常:
我们无法避免这种情况:元素不是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 Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var browser = sender as WebBrowser;
if (browser.ReadyState != WebBrowserReadyState.Complete) return;
var documentFrames = browser.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
}
}
Run Code Online (Sandbox Code Playgroud)