首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >htmlagilitypack和动态内容发布

htmlagilitypack和动态内容发布
EN

Stack Overflow用户
提问于 2012-04-16 14:17:46
回答 3查看 20.2K关注 0票数 15

我想创建一个网页__scraper__应用程序,我想用网页浏览器控件,htmlagilitypack和xpath来完成。

现在,我设法创建了xpath生成器(为此,我使用了webbrowser ),它工作得很好,但有时我无法动态获取(通过javascript或ajax)生成的内容。我还发现,当webbrowser控件(实际上是IE浏览器)生成一些额外的标签时,例如"tbody",而htmlagilitypack htmlWeb.Load(webBrowser.DocumentStream);看不到它。

另一个音符。我发现以下代码实际上抓取了当前的网页源代码,但我无法提供htmlagilitypack (mshtml.IHTMLDocument3)webBrowser.Document.DomDocument;

你能帮我搬一下吗?

EN

回答 3

Stack Overflow用户

发布于 2014-02-22 22:58:58

我刚刚花了几个小时试图让HtmlAgilityPack从网页中呈现一些ajax动态内容,我从一个无用的帖子转到另一个帖子,直到我找到了这篇文章。

答案隐藏在最初的帖子下面的评论中,我想我应该把它弄清楚。

这是我最初使用的方法,但不起作用:

代码语言:javascript
复制
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查询。

这就是有效的解决方案:

代码语言:javascript
复制
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库将其重新解析为敏捷包。

这是我访问动态数据的唯一方法。

希望这能帮助到某个人

票数 30
EN

Stack Overflow用户

发布于 2015-08-07 01:39:27

Selenium会这么做吗。据我所知,它创建了浏览器引擎的实例。在某种程度上,应该允许执行js,并允许您获得被操纵的DOM的结果。

票数 2
EN

Stack Overflow用户

发布于 2013-03-12 16:48:34

使用HTML Agility pack文档的以下方法。

代码语言:javascript
复制
htmlAgilityPackDocument.LoadHtml(this.browser.DocumentText);

代码语言:javascript
复制
if (this.browser.Document.GetElementsByTagName("html")[0] != null)
    _htmlAgilityPackDocument.LoadHtml(this.browser.Document.GetElementsByTagName("html")[0].OuterHtml);
票数 -7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10169484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档