Вопрос по c# – htmlagilitypack и проблема с динамическим контентом

11

Я хочу создать приложение веб-скребка, и я хочу сделать это с помощью элемента управления webbrowser, htmlagilitypack и xpath.

Прямо сейчас мне удалось создать генератор xpath (я использовал webbrowser для этой цели), который работает нормально, но иногда я не могу получить динамически (через javascript или ajax) сгенерированный контент. Также я обнаружил, что когда элемент управления веб-браузера (на самом деле браузер IE) генерирует некоторые дополнительные теги, такие как «tbody», в то время как снова htmlagilitypack `htmlWeb.Load (webBrowser.DocumentStream);` его не видит.

еще одна заметка. Я обнаружил, что следующий код фактически захватывает текущий источник веб-страницы, но я не смог предоставить ему пакет htmlagilitypack `(Mshtml.IHTMLDocument3) webBrowser.Document.DomDocument;`

Можете ли вы помочь мне с этим?

извините, ребята, я нашел решение здесь: var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3) webBrowser.Document.DomDocument; StringReader sr = new StringReader (documentAsIHtmlDocument3.documentElement.outerHTML); htmlDoc.Load (ср); и это сработало. Chyngyz Sydykov
@ user1322188: как вы можете восстановить динамическое содержимое страницы? Это пакет htmlagility используется для восстановления динамического содержимого. SivaRajini
помочь с чем? какой у тебя конкретный вопрос? Вы должны показать код, чтобы получить реальную помощь. L.B

Ваш Ответ

3   ответа
-4

htmlAgilityPackDocument.LoadHtml(this.browser.DocumentText);

ИЛИ ЖЕ

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

мический контент 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.

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

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

сколько времени webBrowser1?
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededikea.com/qa/en/catalog/products/60368726
1

Селен сделать трюк. Насколько мне известно, он создает экземпляры движков браузера ... вроде и должен позволять выполнять js и позволять вам получить результат манипулирования DOM.

Error: User Rate Limit Exceeded

Похожие вопросы