2012-04-24 15 views
0

これは、htmlアジリティパックで特定のタグを取得するために使用する方法です。私はこの方法を使用してGoogleローカルのランキングを行います。それはかなりの時間がかかり、メモリを大量に消費するようですが、誰かにそれをより良くするための提案はありますか?htmlアジリティパックで解析を高速化

private void findGoogleLocal(HtmlNode node) { 

    String name  = String.Empty; 
    // 
    // ---------------------------------------- 
    if (node.Attributes["id"] != null) { 

     if (node.Attributes["id"].Value.ToString().Contains("panel_") && node.Attributes["id"].Value.ToString() != "panel__") 
     { 
     GoogleLocalResults.Add(new Result(URLGoogleLocal, Listing, node, SearchEngine.Google, SearchType.Local, ResultType.GooglePlaces)); 
     } 
    } 

    if (node.HasChildNodes) { 
     foreach (HtmlNode children in node.ChildNodes) { 
     findGoogleLocal(children); 
     } 
    } 

    } 

答えて

2

ためのCSSセレクタエンジンこの方法は再帰的でなければならないのはなぜ?ただ一度のすべてのノード(HAPでのLINQのサポートを使用した例)を取得:XPathを使用して:

var results = node.Descendants() 
        .Where(x=> x.Attributes["id"]!= null && 
          x.Attributes["id"].Value.Contains("panel_") && 
          x.Attributes["id"].Value!= "panel__") 
        .Select(x=> new Result(URLGoogleLocal, Listing, x, SearchEngine.Google, SearchType.Local, ResultType.GooglePlaces)); 
+0

ありがとうございました! foreach(検索結果x) { GoogleLocalResults.Add(x); } –

+0

HtmlNodeにはデフォルトで利用可能なIdプロパティがあるので、これを簡単にすることもできます。だから、x.Id.Contains( "panel_")&&!x.Id == "panel__"とx.Id == nullをチェックする必要はありません。 – jessehouwing

2

は、私はちょうど別の、きれいな、シンプルで高速なソリューションを追加します。

var results = node 
       .SelectNodes(@"//*[contains(@id, 'panel_') and @id != 'panel__']") 
       .Select(x => new Result(URLGoogleLocal, Listing, x, SearchEngine.Google, SearchType.Local, ResultType.GooglePlaces)); 
foreach (var result in results) 
    GoogleLocalResults.Add(result); 
関連する問題