2012-04-24 83 views
0

這是一個我用來用html敏捷包抓取某些標籤的方法。我使用這種方法與谷歌本地做排名。它似乎需要相當多的時間,並且需要大量的內存,有沒有人有任何建議讓它變得更好?在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)的所有節點:

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); } – 2012-04-24 18:14:12

+0

你甚至可以使這個更簡單,因爲HtmlNode有一個默認可用的Id屬性。所以x.Id.Contains(「panel_」)&&!x.Id ==「panel__」並且不需要檢查x.Id == null。 – jessehouwing 2012-04-26 19:30:06

2

我只是想添加一個清潔,簡單,快速的解決方案:使用XPath

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);