从html节点返回null

时间:2012-06-12 08:46:10

标签: c# html xpath html-agility-pack

我正在尝试从此page访问公司名称。

应该返回一个带有“Cascade corporation”的innertext的节点,但是我得到了null。

HtmlNode htest = document.DocumentNode.SelectSingleNode("//*[@id='appbar']/div/div[2]/div[1]/span");

我错过了什么?

P.S。必须使用Chrome

2 个答案:

答案 0 :(得分:3)

我试图在我的机器上重现您的问题。我抓住了请求&使用Fiddler的响应数据。我很惊讶地注意到浏览器的渲染html输出与我的代码不同。

来自Fiddler,我注意到的差异是用户代理值。后来我想出了这个代码,它对我有用。你可以试试看,让我知道。请不要投票给我。我正在努力帮助你...

string url = "http://www.google.com/finance?q=NASDAQ:TXN&fstype=ii";
HtmlWeb web = new HtmlWeb();
web.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0"; // latest firefox 
HtmlDocument doc = web.Load(url);

var node = doc.DocumentNode.SelectSingleNode("//*[@id='appbar']/div/div[2]/div[1]/span")
//var node = doc.DocumentNode.SelectSingleNode("//div[@class='appbar-snippet-primary']/span")

当我评论用户代理行时,我能够重现您的问题。希望它有所帮助。

答案 1 :(得分:0)

在您要链接的页面上没有标识为appbar的元素,只有一个div有一个名为appbar-hide的类,这是源代码中唯一存在的appbar。

当遇到这样的问题时,尝试一步一步的方法。首先选择xpath中的第一个节点,即以HtmlNode htest = document.DocumentNode.SelectSingleNode("//*[@id='appbar']");开头,然后返回null(在这种情况下,将会发现错误的位置)。然后纠正错误,如果您确信其余的都没问题,请再次尝试完整的xpath。如果再次出现错误,请将其恢复到第二个元素即。 //*[@id='appbar']/div和这样的进步,直到你得到你想要的元素