htmlagilitypack和动态内容问题htmlagilitypack和动态内容问题(htmla

2019-05-13 13:37发布

我想创建一个Web应用程序刮板,我想用WebBrowser控件,htmlagilitypack和XPath这样做。

现在我成功地创建XPath的发电机(我使用网页浏览器为了这个目的),它工作正常,但有时我不能动态抓取(通过JavaScript或AJAX)生成的内容。 此外,我发现,当WebBrowser控件(实际上IE浏览器)产生一些额外的标签,如“TBODY”,而再次htmlagilitypack`htmlWeb.Load(webBrowser.DocumentStream);`没有看到它。

另注。 我发现下面的代码实际上是抓住了当前网页源,但我不能用它来htmlagilitypack`(mshtml.IHTMLDocument3)webBrowser.Document.DomDocument供应;`

你能帮帮我吗?

Answer 1:

我只花了几个小时试图让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到敏捷包之前完全呈现的加载。

这是我能得到访问动态数据的唯一途径。

希望它可以帮助别人



Answer 2:

将硒做的伎俩。 据我所知,它创造的浏览器引擎的实例..之类的,应该允许执行JS,让你获得DOM操作的结果。



Answer 3:

使用HTML敏捷包文档的以下方法。

htmlAgilityPackDocument.LoadHtml(this.browser.DocumentText);

要么

if (this.browser.Document.GetElementsByTagName("html")[0] != null)
    _htmlAgilityPackDocument.LoadHtml(this.browser.Document.GetElementsByTagName("html")[0].OuterHtml);


文章来源: htmlagilitypack and dynamic content issue