Разбор html-страницы в WinForm, C #

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

Вопрос

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

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

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

Принятый ответ

Это не похоже на шаблон для 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;
    }
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow