2012-01-28 9 views
0

何がうまくいかないのか分かりません。私はちょうどHtmlAgilityPackと私が持っているものをテストするためのpojectを作成します。HtmlAgilityPackのトラブル

using System; 
using System.Collections.Generic; 
using System.Text; 
using HtmlAgilityPack; 


namespace parseHabra 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      HTTP net = new HTTP(); //some http wraper 
      string result = net.MakeRequest("http://stackoverflow.com/", null); 
      HtmlDocument doc = new HtmlDocument(); 
      doc.LoadHtml(result); 

      //Get all summary blocks 
      HtmlNodeCollection news = doc.DocumentNode.SelectNodes("//div[@class=\"summary\"]"); 
      foreach (HtmlNode item in news) 
      { 
       string title = String.Empty; 
       //trouble is here for each element item i get the same value 
       //all the time 
       title = item.SelectSingleNode("//a[@class=\"question-hyperlink\"]").InnerText.Trim(); 
       Console.WriteLine(title); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

私が選択した各ノードではなく、ドキュメント全体にxpathを作成しているようです。それが何故そうなのか?あらかじめThx。

+0

なぜHTMLを直接ダウンロードするために 'HtmlWeb'を使用していませんか? – Oded

+0

この問題は重要ではありません – gingray

答えて

2

私はあなたのコードを試していませんが、あなたが予想しているように、//が文書全体のルートから現在の要素のルートではないことが問題であると思われます。

//

".//a[@class=\"question-hyperlink\"]" 
+0

しかし、どのようにすることができますか、選択されたノードのコンテンツはhtmldocumentの一部に過ぎませんか? – gingray

+2

@imbriarius、試しましたか? –

+0

@imbriariusの場合、ノードを選択するとドキュメントの残りの部分と分離されないため、ドキュメント全体に対して '//'は依然として残ります。 '.// 'を使用すると、どこからでも、' .'は現在のノードを選択します。 –

1

.を入れてみてください私はというし、要約タイトルを見つけることよりも、すべての質問のタイトルを見つけるために、単一のクエリとして、あなたのXPathを書き換えると思います。クリスの答えは、簡単に避けられたかもしれない問題を指摘する。

var web = new HtmlWeb(); 
var doc = web.Load("http://stackoverflow.com"); 

var xpath = "//div[starts-with(@id,'question-summary-')]//a[@class='question-hyperlink']"; 

var questionTitles = doc.DocumentNode 
    .SelectNodes(xpath) 
    .Select(a => a.InnerText.Trim()); 
+0

私にとってより重要なライブラリの動作を理解する – gingray