analyser un élément dans un div avec le pack d'agilité HTML [C #]

c# html html-agility-pack parsing

Question

J'utilise Html Agility Pack sur un site Web pour extraire des données. Il est facile d'analyser le code HTML dont j'ai besoin, mais j'ai des problèmes avec cet élément HTML (légèrement complexe?).

<tr>
  <td>
    <div onmouseover="toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br /><br /><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')" onmouseout="toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')" onclick="togglestick('clue_J_1_1_stuck')">
... 

Je dois obtenir la valeur de la classe em "correct_response" du div onmouseover en fonction de la valeur clue_J_X_Y. Je ne sais vraiment pas comment aller au-delà de ça ..

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//tr//td/div[@onmouseover]");

Une aide serait appréciée.

Réponse populaire

Je ne sais pas ce que tu es censé sortir de leur em. Mais je vais vous donner toutes les données dont vous dites avoir besoin pour le comprendre.

Nous chargeons d'abord le code HTML.

    string html = "<tr>" +
        "<td>" +
        "<div onmouseover = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br/><br/><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')\" onmouseout = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')\" onclick = \"togglestick('clue_J_1_1_stuck')\"></div></td></tr>";
    HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    //Console.WriteLine(doc.DocumentNode.OuterHtml);

Ensuite, nous obtenons la valeur de l'attribut, onmouseover.

        string toggle = doc.DocumentNode.SelectSingleNode("//tr//td/div[@onmouseover]").GetAttributeValue("onmouseover", "FAILED");

Il retournera FAILED s'il n'a pas trouvé d'attribut nommé "onmouseover". Nous obtenons maintenant les paramètres de la méthode de basculement où chacun est entouré de deux '(apostrophe).

//Get Variables from toggle()
List<string> toggleVariables = new List<string>();
bool flag = false; string temp = "";
for(int i=0; i<toggle.Length; i++)
{
    if (toggle[i] == '\'' && flag== true)
    {
        toggleVariables.Add(temp);
        temp = "";
        flag = false;
    }
    else if (flag)
    {
        temp += toggle[i];
    }
    else if (toggle[i] == '\'')
    {
        flag = true;
    }
}

Après cela, nous avons une liste avec 3 entités. Dans ce cas, il contiendra les éléments suivants.

  • clue_J_1_1
  • clue_J_1_1_stuck
  • <em class = "correct_response"> Obama </ em> <br/> <br/> <table width = "100%"> <tr> <td class = "right"> Kailyn </ td> </ tr> </ table>;

Nous pouvons maintenant créer un nouveau document HTML avec le code HTML du troisième paramètre. Mais nous devons d’abord le convertir en HTML exploitable, car le troisième paramètre contient des caractères d’échappement HTML.

        //Make it into workable HTML
        toggleVariables[2] = HttpUtility.HtmlDecode(toggleVariables[2]);

        //New HtmlDocument
        HtmlDocument htmlInsideToggle = new HtmlDocument();
        htmlInsideToggle.LoadHtml(toggleVariables[2]);

        Console.WriteLine(htmlInsideToggle.DocumentNode.OuterHtml);

Et fait. Le code dans son intégralité est ci-dessous à partir d'ici.

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using HtmlAgilityPack;
using System.Web;

namespace test
{
    class Program
    {

    public static void Main(string[] args)
    { 
            string html = "<tr>" +
                "<td>" +
                "<div onmouseover = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br/><br/><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')\" onmouseout = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')\" onclick = \"togglestick('clue_J_1_1_stuck')\"></div></td></tr>";
            HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(html);
            //Console.WriteLine(doc.DocumentNode.OuterHtml);

            string toggle = doc.DocumentNode.SelectSingleNode("//tr//td/div[@onmouseover]").GetAttributeValue("onmouseover", "FAILED");
            //Clean up string

            //Console.WriteLine(toggle);

            //Get Variables from toggle()
            List<string> toggleVariables = new List<string>();
            bool flag = false; string temp = "";
            for(int i=0; i<toggle.Length; i++)
            {
                if (toggle[i] == '\'' && flag== true)
                {
                    toggleVariables.Add(temp);
                    temp = "";
                    flag = false;
                }
                else if (flag)
                {
                    temp += toggle[i];
                }
                else if (toggle[i] == '\'')
                {
                    flag = true;
                }
            }

            //Make it into workable HTML
            toggleVariables[2] = HttpUtility.HtmlDecode(toggleVariables[2]);
            //New HtmlDocument
            HtmlDocument htmlInsideToggle = new HtmlDocument();
            htmlInsideToggle.LoadHtml(toggleVariables[2]);

            Console.WriteLine(htmlInsideToggle.DocumentNode.OuterHtml);

            //You're on your own from here                

            Console.ReadKey();

    }
}


Related

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