我正在使用HtmlAgility包來解析html頁面。我能夠從我必須獲取數據的位置找到我的部分。實際上它是一個表,我必須解析它的tr。基本上,我有兩個問題。
當我在解析器中加載頁面時,它需要大約20-30秒才能將其加載到內存中,並且有大約4738個網頁需要解析。所以,我想減少它....我想知道我可以使用委託在循環中調用該方法,以便我可以減少延遲的時間。或者有沒有有效的方法這樣做。請指導我。
我得到的行為"\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;
}
}