htmlagilitypack et problème de contenu dynamique

c# dynamic-content html-agility-pack

Question

Salut à tous.

Je veux créer une application Web Scrapper et je veux le faire avec le contrôle WebBrowser, htmlagilitypack et xpath.

À l’heure actuelle, j’ai réussi à créer un générateur de xpath (j’utilisais webbrowser à cette fin), ce qui fonctionne bien, mais parfois, je ne peux pas saisir le contenu généré dynamiquement (via javascript ou ajax). Aussi, j'ai découvert que lorsque le contrôle navigateur Web (en fait, le navigateur IE) génère des balises supplémentaires comme "tbody", alors que htmlagilitypack `htmlWeb.Load (webBrowser.DocumentStream);` ne le voit pas.

une autre note. J'ai découvert que le code suivant saisit la source de la page Web actuelle, mais je ne pouvais pas lui fournir le htmlagilitypack `(mshtml.IHTMLDocument3) webBrowser.Document.DomDocument;`

Pouvez-vous m'aider s'il vous plaît? Merci

Réponse populaire

Je viens de passer des heures à essayer d'obtenir que HtmlAgilityPack rende du contenu dynamique ajax à partir d'une page Web et je passais d'un message inutile à un autre jusqu'à ce que je trouve celui-ci.

La réponse est cachée dans un commentaire sous le post initial et j'ai pensé que je devrais la redresser.

C'est la méthode que j'ai utilisée initialement et qui n'a pas fonctionné:

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 ne rendra ni n'exécutera les requêtes ajax qui rendent le contenu manquant.

C'est la solution qui a fonctionné:

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();
}

L'idée est de charger à l'aide de WebBrowser, capable de restituer le contenu ajax, puis d'attendre que la page soit entièrement restituée avant d'utiliser la bibliothèque Microsoft.mshtml pour ré-analyser le code HTML dans le pack d'agilité.

C’est la seule façon pour moi d’avoir accès aux données dynamiques.

J'espère que ça aide quelqu'un




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi