Разбор HTML-страницы в WinForm, C # - PullRequest
0 голосов
/ 25 января 2012

Я использую пакет 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\"]");

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

1 Ответ

0 голосов
/ 26 января 2012

Не похоже, что есть шаблон для 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;
    }
}
...