2011-04-10 86 views
1

我正在嘗試使用敏捷包解析來自各個頁面的某些信息位。我有點擔心,如果有這種情況,可以隨時讓我知道,那麼使用它可能會使我需要的東西過度消耗。無論如何,我試圖從雜色的傻瓜分析一個頁面,以獲取基於股票的公司名稱。我將解析幾個頁面以類似的方式獲取股票信息。HTML敏捷包問題(試圖從源頭解析字符串)

,我想分析看起來像HTML:

<h1 class="subHead"> 
    Microsoft Corp <span>(NASDAQ:MSFT)</span> 
</h1> 

另外,我想分析的頁面是:http://caps.fool.com/Ticker/MSFT.aspx

所以,我想我的問題是怎麼做的,我只是得到了微軟公司從HTML,我應該甚至使用敏捷包來做這樣的事情?

編輯:當前代碼

public String getStockName(String ticker) 
{ 
    String text =""; 
    HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb(); 
    HtmlAgilityPack.HtmlDocument doc = web.Load("http://caps.fool.com/Ticker/" + ticker + ".aspx"); 

    var node = doc.DocumentNode.SelectSingleNode("/h1[@class='subHead']"); 
    text = node.FirstChild.InnerText.Trim(); 
    return text; 
} 
+1

我發現HTML Agility Pack非常適合這種情況 - 即沒有提供數據源的地方,但是由於某些原因,您仍然想要解析第三方數據。我做了一些和你過去的工作非常相似的東西。下一步是解析出價格,每日變化等。:) – 2011-04-10 21:23:53

+0

@ C.McAtackney謝謝!是的,這只是一個開始,但我認爲一旦我的腳溼了,就不會那麼粗糙了。我很感激你讓我知道我走在正確的軌道上。 – PFranchise 2011-04-10 21:28:11

回答

2

這會給你的所有股票名稱的列表,爲您的樣本HTML只是微軟:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.Load("test.html"); 

var nodes = doc.DocumentNode.SelectNodes("//h1[@class='subHead']"); 
foreach (var node in nodes) 
{ 
    string text = node.FirstChild.InnerText; //output: "Microsoft Corp" 
    string textAll = node.InnerText; //output: "Microsoft Corp (NASDAQ:MSFT)" 
} 

編輯基於新的問題 - 這應該爲你工作:

string text = ""; 
HtmlWeb web = new HtmlWeb(); 

string url = string.Format("http://caps.fool.com/Ticker/{0}.aspx", ticker); 
HtmlAgilityPack.HtmlDocument doc = web.Load(url); 

var node = doc.DocumentNode.SelectSingleNode("//h1[@class='subHead']"); 
text = node.FirstChild.InnerText.Trim(); 
return text; 
+0

@broken謝謝!我很感激幫助。如果您不介意,我在編輯的底部描述了另一個小問題,我很感謝您在此問題上可能提供的任何幫助。祝你有美好的一天! – PFranchise 2011-04-10 21:15:09

+0

@PFranchise:更新了我的答案 – BrokenGlass 2011-04-10 21:17:19

+0

@BrokenGlass再次感謝你!我正在處理更新的代碼,但仍然出現錯誤。 「你調用的對象是空的。」它發生在節點... Trim()。有沒有可能選擇節點沒有找到任何東西? – PFranchise 2011-04-10 21:29:24

1

使用XPath表達式來選擇元件然後拾取的文本。

foreach (var element in doc.DocumentNode.SelectNodes("//h1[@clsss='subHead']/span")) 
{ 
    Console.WriteLine (element.InnerText); 
}