analizar un elemento en un div con el paquete de agilidad html [C #]

c# html html-agility-pack parsing

Pregunta

Estoy usando Html Agility Pack en un sitio web para extraer algunos datos. Analizar parte del HTML que necesito es fácil, pero estoy teniendo problemas con este (¿un poco complejo?) Fragmento de 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')">
... 

Necesito obtener el valor de la clase em "correct_response" en el div onmouseover basado en el valor clue_J_X_Y. Realmente no sé cómo ir más allá de esto ..

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

Un poco de ayuda sería apreciada.

Respuesta popular

No sé qué se supone que debes sacar de ellos. Pero te daré todos los datos que dices que necesitas para resolverlo.

Primero cargamos el 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);

Entonces obtenemos el valor del atributo, onmouseover.

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

Devolverá un error si no pudo encontrar un atributo llamado "onmouseover". Ahora obtenemos los parámetros del método de alternancia donde cada uno está encerrado por dos '(apóstrofe).

//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;
    }
}

Después de eso tenemos una lista con 3 entidades. En este caso contendrá lo siguiente.

  • 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>;

Ahora podemos crear un nuevo documento HtmlDocument con el código HTML del tercer parámetro. Pero primero tenemos que convertirlo en HTML viable ya que el tercer parámetro contiene caracteres de escape de 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);

Y hecho. El código en su totalidad está abajo de aquí.

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

    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué