【问题标题】:speed up parsing in html agility pack加快 html 敏捷包中的解析
【发布时间】:2012-04-24 17:16:05
【问题描述】:

这是我使用 html 敏捷包抓取某些标签的方法。我用这个方法用google local做排名。这似乎需要相当多的时间和内存密集型,有没有人有任何建议可以让它变得更好?

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

  }

【问题讨论】:

    标签: c# html-agility-pack web-crawler google-local-search


    【解决方案1】:

    为什么这个方法必须是递归的?一口气获取所有节点(例如使用 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));
    

    【讨论】:

    • 谢谢你的作品完美! foreach(结果中的结果 x){ GoogleLocalResults.Add(x); }
    • 你甚至可以让这个更简单,因为 HtmlNode 有一个默认可用的 Id 属性。所以 x.Id.Contains("panel_") && !x.Id == "panel__" 也不需要检查 x.Id == null 。
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      Fizzler:HAP 的 CSS 选择器引擎

      http://code.google.com/p/fizzler/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多