htmlagilitypack и динамический контент

c# dynamic-content html-agility-pack

Вопрос

Всем привет.

Я хочу создать приложение web scrapper, и я хочу сделать это с помощью элемента управления 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++;
    }
}

Идея состоит в том, чтобы загрузить с помощью WebBrowser, который способен визуализировать содержимое ajax, а затем дождаться, пока страница полностью отобразится, а затем, используя библиотеку Microsoft.mshtml, повторно проанализируйте HTML в пакете agility.

Это был единственный способ получить доступ к динамическим данным.

Надеюсь, это поможет кому-то



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow