2011-06-10 84 views
1

我试图使用HTML Agility Pack在Google上查找特定关键字,然后检查链接的节点,直到找到我的网站字符串url,然后解析我为Google提供的节点的innerHTML排行。Agility Pack XPath问题

我对Agility Pack比较陌生(就像昨天我开始真的看过它一样),所以我希望我可以得到一些帮助。当我在下面进行搜索时,每次都会在我的Xpath查询中遇到失败。即使我插入一些像SelectNodes(“// * [@ id ='rso']”)那样简单的东西。这是我做错了吗?

private void GoogleScrape(string url) 
    { 
     string[] keys = keywordBox.Text.Split(','); 
     for (int i = 0; i < keys.Count(); i++) 
     { 
      var raw = "http://www.google.com/search?num=100&q="; 
      string search = raw + HttpUtility.UrlEncode(keys[i]); 
      var webGet = new HtmlWeb(); 
      var document = webGet.Load(search); 
      loadtimeBox.Text = webGet.RequestDuration.ToString(); 

      var ranking = document.DocumentNode.SelectNodes("//*[@id='rso']"); 

      if (ranking != null) 
      { 
       googleBox.Text = "Something"; 
      } 
      else 
      { 
       googleBox.Text = "Fail"; 
      } 
      } 
      } 
+0

你得到了什么类型的“失败”? – alexn 2011-06-10 18:38:03

+0

在.//*[@id='rso']标记下查找内容时,var排名总是返回null,这就是所有搜索结果在页面返回时都没有多个结果。 .//*[@id='resultStats']返回“Something”,但其他标签中的确切等效项不会返回 – Danejir 2011-06-10 18:44:24

+0

另外,我可以使用Regex表达式来查找相同的“节点”,所以我知道它们显示为那里并且应该可以在Xpath方向找到,它只是没有返回结果 – Danejir 2011-06-10 19:34:02

回答

2

这不是敏捷包的内疚 - 这是棘手的谷歌。如果使用调试器检查HtmlDocument的_text属性,那么当您在浏览器中检查它时发现<ol>具有id='rso'由于某种原因没有任何属性。

我认为,在这种情况下,你可以通过检索算法“// OL”,因为只有一个<ol>在此刻的谷歌的结果页面标签...

更新:我已经做了进一步检查。例如,当我这样做:

using (StreamReader sr = 
     new StreamReader(HttpWebRequest 
      .Create("http://www.google.com/search?num=100&q=test") 
      .GetResponse() 
      .GetResponseStream())) 
{ 
    string s = sr.ReadToEnd(); 
    var m2 = Regex.Matches(s, "\\sid=('[^']+'|\"[^\"]+\")"); 
    foreach (var x in m2) 
     Console.WriteLine(x); 
} 

返回的唯一的ID是:“sflas”,“hidden_​​modes”和“tbpr_12”。

总结:我已经使用了Html Agility Pack,即使格式不正确的html(未封闭的<p>甚至<li>标签等)也能很好地应对。

+0

谢谢!实际上最终与// h3一起提供了更多的本地化信息,但是你让我走上了正确的道路。 – Danejir 2011-06-10 20:21:50