解析WinForm中的html頁面,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\"]");

提前致謝

一般承認的答案

它看起來不像網頁上的網址,ID或其他任何內容。它的設計很差。如果它有一個很好的模式(例如結果的不同頁碼),那麼也許這可以並行完成。因為它不是,你必須按順序執行它,因為沒有可靠的方法(我可以看到)將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;
    }
}


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因