WinForm、C#でHTMLページを解析する

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

質問

私はHTMLページを解析するためにHtmlAgilityパックを使用しています。私はどこからデータを取得する必要がある私のセクションを見つけることができる。実際にはテーブルと私はそのtrを解析する必要があります。基本的に、私は2つのクエリを持っています。

  1. パーサーでページを読み込むと、メモリにロードするのに20〜30秒かかり、解析するWebページは約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、ニューデリー、デリーとバロダハウスを解析する必要があります。実際に私はPincode、Area、State、およびDistrictのプロパティを持つPincodesクラスを持っています。だから、これらの値をクラスに入れるために正規表現や何らかの方法が必要です。

最後に、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、idsなどのパターンがないように見えます。それはあまり設計されていなかった。良いパターン(結果のページ番号など)があった場合は、おそらくこれを並行して行うことができます。それはないので、次のページに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は合法ですか? はい、理由を学ぶ