2016-09-28 132 views
-1

我的如下C#htmlagilitypack XPATH回報System.NullReferenceException

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using HtmlAgilityPack; 

namespace ConsoleApplication2 
    { 
    class Program 
     { 
     static void Main(string[] args) 
      { 

      HtmlWeb webClient = new HtmlWeb(); 

      HtmlAgilityPack.HtmlDocument doc = webClient.Load("https://uk.finance.yahoo.com/q/hp?s=0001.HK"); 

      string date = doc.DocumentNode.SelectSingleNode(@"/html/body/div/div/table/tbody/tr[2]/td[1]/table/tbody/tr/td/table/tbody/tr[2]/td[1]").InnerText; 

      Console.Write(date); 
      Console.ReadKey(); 

     } 
    } 
} 

但是,Xpath的返回空值,我用XPATH幫手來檢查代碼,它是正確的(請參見附圖)

XPATH

任何人都可以給我一些想法嗎?謝謝

回答

0

你沒有說你實際上想要從哪個節點中提取,你的XPath我知道你想要表中的第一列,我是否正確? 您的XPath返回null的原因很多,主要原因是您應該使用更通用的XPath。你使用的插件是很好的,但它顯示了一個非常特定的XPath,所以如果頁面中最小的東西發生了變化,即使是你看不到的東西,XPath也不再有效。還有一點需要記住的是,你的瀏覽器改變了HTML(例如,我面對着Chrome的許多差異,特別是Chrome的表格變成了'Div')。另一個重要的注意事項是,使用id/class名稱來提取XPath時,我更喜歡使用'contains'而不是實際名稱,因爲如上所述,它們都可以更改。

TL; DR:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
HtmlNode node = doc.DocumentNode.SelectSingleNode("//table[contains(@class, 'yfnc')]//table//td[contains(@class, 'yfnc_tabledata1')][1]"); 
if(node != null) 
{ 
    // Extract its InnerText 
} 

最後一件事,當你提取一個節點,你應該檢查它是否試圖提取它的innerText,或用「嘗試」包裹之前空第一 - 'catch'子句,以捕獲NullReferenceException。

+0

對不起,我試過你的代碼。它仍然返回null 希望有些機構可以添加更多評論 – wkcalvin