2011-06-10 127 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