Análisis de la página html en WinForm, C #

c# html-agility-pack html-parsing linq-to-sql winforms

Pregunta

Estoy usando el paquete HtmlAgility para analizar la página html. Puedo ubicar mi sección desde donde tengo que obtener datos. En realidad es una tabla y tengo que analizar su tr. Básicamente, tengo dos consultas.

  1. Cuando cargué una página en el analizador, me tomó entre 20 y 30 segundos cargarla en la memoria y hay alrededor de 4738 páginas web para analizar. Por lo tanto, quiero reducirlo ... Quiero saber ¿Puedo usar el método delegate call en un bucle para que pueda reducir el tiempo de demora? O hay alguna forma eficiente de hacerlo. Por favor guíame a través de eso.

  2. Obtengo mi fila como "\r\n\t\t\t\t<td style=\"width:20%;\">110001</td><td style=\"width:25%;\">New Delhi</td><td style=\"width:25%;\">Delhi</td><td style=\"width:30%;\">Baroda House</td>\r\n\t\t\t" , de lo anterior, debo analizar 11001, Nueva Delhi, Delhi y Baroda House. En realidad, estoy teniendo un Pincodes clase donde tengo las propiedades Pincode, Área, Estado y Distrito. Así que necesito una expresión regular o alguna forma de poner estos valores a la clase.

Finalmente, tengo que insertar estos registros en mi base de datos donde estoy usando Linq2Sql. Así que guardando todas las cosas, por favor díganme una solución. Cualquier referencia o enlace será de gran ayuda.

Mi código:

  var url = @"http://www.eximguru.com/traderesources/pincode.aspx?&GridInfo=Pincode01";
            var web = new HtmlWeb();
            var doc = web.Load(url);
            //doc.DocumentNode.SelectSingleNode("//*[@id=\"lst-ib\"]");//("/html/body/div[2]/form/div/div[2]/table/tbody/tr/td/table/tbody/tr/td/div/table/tbody/tr/td/table/tbody/tr/td[2]/div/input");
            //System.Console.WriteLine(doc.DocumentNode.SelectSingleNode("//*[@id=\"lst-ib\"]").Id);
            var htmlNode =
                doc.DocumentNode.SelectSingleNode(
                    "//*[@id=\"ctl00_uxContentPlaceHolder_ResourceAndGuideUserControl1_ResourceAndGuideGrid_myGridView_mainGridView\"]");

Gracias por adelantado

Respuesta aceptada

No parece que haya un patrón en las URL, ID o cualquier otra cosa en esa página. Estaba mal diseñado. Si hubiera un buen patrón (como los diferentes números de página para los resultados), tal vez esto podría hacerse en paralelo. Como no lo es, tendrías que hacerlo secuencialmente, ya que no hay un método confiable (que pueda ver) para obtener la URL en la página siguiente.

var url = "http://eximguru.com/traderesources/pincode.aspx?&GridInfo=Pincode01";
var web = new HtmlWeb();
var results = new List<Pincode>();
while (!String.IsNullOrWhiteSpace(url))
{
    var doc = web.Load(url);
    var query = doc.DocumentNode
        .SelectNodes("//div[@class='Search']/div[3]//tr")
        .Skip(1)
        .Select(row => row.SelectNodes("td"))
        .Select(row => new Pincode
        {
            PinCode = row[0].InnerText,
            District = row[1].InnerText,
            State = row[2].InnerText,
            Area = row[3].InnerText,
        });
    results.AddRange(query);

    var next = doc.DocumentNode
        .SelectSingleNode("//div[@class='slistFooter']//a[last()]");
    if (next != null && next.InnerText == "Next")
    {
        url = next.Attributes["href"].Value;
    }
    else
    {
        url = null;
    }
}


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é