2012-01-25 3 views
-3

Я использую пакет HtmlAgility для разбора html-страницы. Я могу найти мой раздел, откуда я должен получить данные. Фактически его таблица и я должен разбирать ее tr. В принципе, у меня есть два запроса.Parsing html page в WinForm, C#

  1. Когда я загрузить страницу в парсер, потребовалось около 20-30 секунд, чтобы загрузить его в память и есть около 4738 веб-страниц для разбора. Итак, я хочу уменьшить его .... Я хочу знать Могу ли я использовать делегат, вызывающий метод в цикле, чтобы я мог сократить время задержки. Или есть эффективный способ сделать это. Пожалуйста, направляйте меня через это.

  2. Я получаю свой ряд как "\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", из вышеизложенного я должен разобрать 11001, Нью-Дели, Дели и дом Бароды. На самом деле у меня есть класс Pincodes, где у меня есть свойства Pincode, Area, State и District. Поэтому мне нужно регулярное выражение или какой-то способ поместить эти значения в класс.

Наконец-то я должен нажать эти записи в свою базу данных, где я использую Linq2Sql. Поэтому, сохраняя все, скажите, пожалуйста, решение. Любая ссылка или ссылка будут большой помощью.

Мой код:

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

Заранее спасибо

ответ

1

Это не похоже, что есть шаблон для URL-адресов, ид или что-нибудь еще на этой странице. Это плохо спроектировано. Если бы у него был хороший шаблон (например, разные номера страниц для результатов), возможно, это можно было бы сделать параллельно. Поскольку это не так, вам придется делать это последовательно, так как нет надежного метода (который я вижу), чтобы получить URL-адрес на следующей странице.

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