我想创建一个Web应用程序刮板,我想用WebBrowser控件,htmlagilitypack和XPath这样做。
现在我成功地创建XPath的发电机(我使用网页浏览器为了这个目的),它工作正常,但有时我不能动态抓取(通过JavaScript或AJAX)生成的内容。 此外,我发现,当WebBrowser控件(实际上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++;
}
}
我们的想法是使用WebBrowser是能够呈现Ajax内容,然后等到页面,然后使用Microsoft.mshtml库重新解析HTML到敏捷包之前完全呈现的加载。
这是我能得到访问动态数据的唯一途径。
希望它可以帮助别人
将硒做的伎俩。 据我所知,它创造的浏览器引擎的实例..之类的,应该允许执行JS,让你获得DOM操作的结果。
使用HTML敏捷包文档的以下方法。
htmlAgilityPackDocument.LoadHtml(this.browser.DocumentText);
要么
if (this.browser.Document.GetElementsByTagName("html")[0] != null)
_htmlAgilityPackDocument.LoadHtml(this.browser.Document.GetElementsByTagName("html")[0].OuterHtml);