Analisi della pagina html in WinForm, C #

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

Domanda

Sto usando il pacchetto HtmlAgility per analizzare la pagina html. Sono in grado di individuare la mia sezione da dove devo ottenere i dati. In realtà è un tavolo e devo analizzare il suo tr. Fondamentalmente, ho due domande.

  1. Quando carico una pagina in parser, ci sono voluti circa 20-30 secondi per caricarlo in memoria e ci sono circa 4738 pagine web da analizzare. Quindi, voglio ridurlo .... Voglio sapere Posso usare delegare chiamare il metodo in un ciclo in modo da poter ridurre il tempo di ritardo. O c'è un modo efficace per farlo. Per favore guidami attraverso quello.

  2. Sto ottenendo la mia riga come "\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" , da quanto sopra devo analizzare 11001, Nuova Delhi, Delhi e Baroda House. In realtà sto avendo una classe Pincodes dove ho le proprietà Pincode, Area, State e District. Quindi ho bisogno di una regex o di un modo per mettere questi valori nella classe.

Infine devo spingere questi record al mio database dove sto usando Linq2Sql. Quindi, mantenendo tutte le cose, per favore dì, dammi una soluzione. Qualsiasi riferimento o collegamento sarà di grande aiuto.

Il mio codice:

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

Grazie in anticipo

Risposta accettata

Non sembra che ci sia un modello per gli URL, gli ID o qualsiasi altra cosa su quella pagina. Era mal progettato. Se ci fosse un buon modello (come i diversi numeri di pagina per i risultati), forse questo potrebbe essere fatto in parallelo. Dal momento che non lo è, dovresti farlo in modo sequenziale poiché non esiste un metodo affidabile (che io possa vedere) per ottenere l'url alla pagina successiva.

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché