在html敏捷包中加速解析
问题描述:
这是一个我用来用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);
}
}
}
答
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));
答
我只是想添加一个清洁,简单,快速的解决方案:使用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);
谢谢你的作品完美! foreach(结果中的结果x) { GoogleLocalResults.Add(x); } – 2012-04-24 18:14:12
你甚至可以使这个更简单,因为HtmlNode有一个默认可用的Id属性。所以x.Id.Contains(“panel_”)&&!x.Id ==“panel__”并且不需要检查x.Id == null。 – jessehouwing 2012-04-26 19:30:06