2012-07-19 91 views
0

我試圖從here(表中的冠軍鏈接標題)獲得所有名稱的列表,但我沒有成功..任何人都可以指示我這個代碼有什麼問題嗎?如何獲取所有鏈接標題?

謝謝!

var url = "http://leagueoflegends.wikia.com/wiki/List_of_champions"; 
var web = new HtmlWeb(); 
var doc = web.Load(url);    

foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table[3]/tr")) 
{ 
    HtmlNode item = table.SelectSingleNode("//a"); 
    Console.WriteLine(item.GetAttributeValue("title", false)); 
} 

UPDATE:

好吧,我得到它的工作只是罰款與此代碼:

var url = "http://leagueoflegends.wikia.com/wiki/List_of_champions"; 
var web = new HtmlWeb(); 
var doc = web.Load(url);    

foreach (HtmlNode item in doc.DocumentNode.SelectNodes("//table[3]/tr/td/span/a")) 
{ 
    Console.WriteLine(item.Attributes["title"].Value); 
} 

return true; 

感謝您的幫助!

回答

1

請使用XPath這樣

foreach (HtmlNode linkItem in doc.DocumentNode.SelectNodes("//table[3]/tr//a")) 
{ 
    Console.WriteLine(linkItem.Attributes["title"].Value()); 
    Console.WriteLine(linkItem.Attributes["alt"].Value()); 
} 
+0

引發一堆FormatExceptions>。 – argoneus 2012-07-19 13:15:03

+0

@argoneus在哪一行上,請你可以顯示錯誤 – HatSoft 2012-07-19 13:15:50

+0

現在它工作正常,它是之前的編輯代碼。那麼,不是很好,它會打印每個名稱兩次出於某種原因超過我>> – argoneus 2012-07-19 13:17:26

1

我敲了一個快速和骯髒的例子,測試和完美的作品,你要有點雖然格式化結果:

protected void Page_Load(object sender, EventArgs e) 
{ 
     List<HtmlAgilityPack.HtmlNode> test = GetInnerTest(); 

     foreach (var node in test) 
     { 
      Response.Write("Result: " + node.InnerHtml.ToString()); 
     } 

} 

public List<HtmlAgilityPack.HtmlNode> GetInnerTest() 
{ 
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

    doc.OptionFixNestedTags = true; 
    doc.Load(requestData("http://leagueoflegends.wikia.com/wiki/List_of_champions")); 

    var node = doc.DocumentNode.Descendants("span").Where(d => d.Attributes.Contains("class") && d.Attributes["class"].Value.Contains("character_icon")).ToList(); 

    return node; 
} 


public StreamReader requestData(string url) 
{ 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 

     StreamReader sr = new StreamReader(resp.GetResponseStream()); 

     return sr; 
} 

您需要下載HtmlAgilityPack幷包含其參考。

+0

我明白這是如何工作的,除了一個問題: '很不習慣'Where'的語法(在GetInnerTest())中,它基本上是一個lambda? – argoneus 2012-07-19 13:38:46

+0

是的,它是linq/lambda。 [請閱讀](http://www.dotnetperls.com/lambda)。 – dtsg 2012-07-19 13:40:10