2012-04-24 96 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);