我想创建一个Web抓取应用程序,并且要使用Webbrowser控件,htmlagilitypack和xpath来做。
现在我设法创建了xpath生成器(我为此目的使用了webbrowser),它可以正常工作,但是有时我无法动态地(通过javascript或ajax)获取生成的内容。我还发现,当网络浏览器控件(实际上是IE浏览器)生成一些额外的标签(例如“ tbody”)时,而htmlagilitypack`htmlWeb.Load(webBrowser.DocumentStream);`却没有看到它。
另一个说明。我发现以下代码实际上可以获取当前的网页源,但是我无法提供htmlagilitypack((mshtml.IHTMLDocument3)webBrowser.Document.DomDocument;`
你能帮我吗?
我花了好几个小时试图让HtmlAgilityPack从网页上呈现一些ajax动态内容,然后我从一个无用的帖子转到另一个,直到找到这个。
答案隐藏在初始帖子下的评论中,我认为我应该理顺它。
这是我最初使用的方法,但不起作用:
private void LoadTraditionalWay(String url)
{
WebRequest myWebRequest = WebRequest.Create(url);
WebResponse myWebResponse = myWebRequest.GetResponse();
Stream ReceiveStream = myWebResponse.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
TextReader reader = new StreamReader(ReceiveStream, encode);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(reader);
reader.Close();
}
WebRequest不会呈现或执行呈现缺少内容的ajax查询。
这是有效的解决方案:
private void LoadHtmlWithBrowser(String url)
{
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate(url);
waitTillLoad(this.webBrowser1);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)webBrowser1.Document.DomDocument;
StringReader sr = new StringReader(documentAsIHtmlDocument3.documentElement.outerHTML);
doc.Load(sr);
}
private void waitTillLoad(WebBrowser webBrControl)
{
WebBrowserReadyState loadStatus;
int waittime = 100000;
int counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
{
break;
}
counter++;
}
counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if (loadStatus == WebBrowserReadyState.Complete && webBrControl.IsBusy != true)
{
break;
}
counter++;
}
}
我们的想法是使用能够呈现ajax内容的WebBrowser加载,然后等待页面完全呈现,然后使用Microsoft.mshtml库将HTML重新解析为敏捷包。
这是我可以访问动态数据的唯一方法。
希望它可以帮到某人