2010-09-29 159 views
5

我試圖解析這個字段,但不能讓它工作。當前嘗試:C#Html敏捷包(SelectSingleNode)

var name = doc.DocumentNode.SelectSingleNode("//*[@id='my_name']").InnerHtml; 


<h1 class="bla" id="my_name">namehere</h1> 

錯誤:未將對象引用設置爲對象的實例。

感謝任何幫助。

@John - 我可以保證HTML正確加載。我正在嘗試閱讀我的Facebook名稱以進行學習。這裏是Firebug插件的截圖。我使用的版本是1.4.0。

http://i54.tinypic.com/kn3wo.jpg

我想這個問題是profile_name爲一個子節點或什麼的,這就是爲什麼我不能讀它?

+0

你試過調試嗎?你的代碼失敗了什麼?你寫的代碼能正常工作。 – 2010-09-29 03:53:14

+0

我發佈了它失敗的行。 – josh 2010-09-29 15:23:41

+0

你能展示加載你的HTML的代碼嗎?另外,鏈中的哪個對象爲空?你有多個具有相同ID的H1標籤嗎?你使用的是什麼版本的HTML敏捷包? – 2010-09-29 16:07:46

回答

0

試試這個:

var name = doc.DocumentNode.SelectSingleNode("//@id='my_name'").InnerHtml; 
+0

不起作用。 「表達式必須評估爲一個節點集。」 – josh 2010-09-29 15:24:43

18

您的代碼不工作的原因是因爲有是實際寫出<h1 id='profile_name'>標籤頁面上的JavaScript,所以如果你從一個用戶請求頁面代理(或通過AJAX),不執行JavaScript,那麼你不會找到該元素。

我可以使用下面的選擇讓我自己的名字:

string name = 
    doc.DocumentNode.SelectSingleNode("//a[@id='navAccountName']").InnerText; 
+0

這應該被標記爲答案。這實際上幫助了我。動態生成的代碼不能在此dll中工作。 – 2012-06-29 21:09:01

0
HtmlAgilityPack.HtmlNode name = doc.DocumentNode.SelectSingleNode("//h1[@id='my_name']").InnerText; 
0
public async Task<List<string>> GetAllTagLinkContent(string content) 
    { 


     string html = string.Format("<html><head></head><body>{0}</body></html>", content); 
     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(html); 
     var nodes = doc.DocumentNode.SelectNodes("//[@id='my_name']"); 
     return nodes.ToList().ConvertAll(r => r.InnerText).Select(j => j).ToList(); 

    } 

這是確定用( 「// A [@href]」);你可以像上面一樣試試。希望對你有幫助