2016-09-28 58 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