Analyse de la page html dans WinForm, C #

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

Question

J'utilise HtmlAgility Pack pour analyser la page HTML. Je suis capable de localiser ma section d'où je dois obtenir des données.En fait c'est une table et je dois analyser son tr. En gros, j'ai deux questions.

  1. Lorsque je charge une page dans un analyseur syntaxique, il faut environ 20-30 secondes pour la charger en mémoire et environ 4738 pages Web à analyser. Donc, je veux le réduire .... Je veux savoir Puis-je utiliser délégué dans une boucle pour pouvoir réduire le temps de retard? Ou existe-t-il un moyen efficace de le faire? S'il vous plaît guidez-moi à travers cela.

  2. Je reçois ma ligne comme suit: "\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 ce qui précède, je dois analyser 11001, New Delhi, Delhi et Baroda House. En fait, je vais avoir une classe Pincodes où j'ai les propriétés Pincode, Area, State et District. J'ai donc besoin d'un regex ou d'un moyen de mettre ces valeurs en classe.

Enfin, je dois repousser ces enregistrements dans ma base de données où j'utilise Linq2Sql. Alors gardant toutes les choses, dites s'il vous plaît donnez-moi la solution. Toute référence ou lien sera d'une grande aide.

Mon code:

  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\"]");

Merci d'avance

Réponse acceptée

Il ne semble pas que les URL, les identifiants ou tout autre élément de cette page soient régularisés. C'était mal conçu. S'il y avait un motif intéressant (tel que les numéros de page différents pour les résultats), cela pourrait peut-être être fait en parallèle. Comme ce n'est pas le cas, vous devrez le faire de manière séquentielle car il n'existe aucune méthode fiable (à ma connaissance) pour obtenir l'URL de la page suivante.

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



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