这是我第一次尝试使用HAP获取元素值。当我尝试使用InnerText时,我得到一个空对象错误。
我正在抓取的网址是: - http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013 我试图从日更改汇总表中获取当前高点的值。
我的代码位于底部。首先,我想知道我是否正确地采取了这种方式?如果是这样,那么我的XPath值是不正确的呢?
XPath值是使用我发现的名为htmlagility helper的实用程序获得的。下面的XPath的firebug版本也给出了同样的错误: - / HTML /体/格[3] / DIV /表/ tbody的/ TR [3] / TD /表/ tbody的/ TR [5] / TD [3]
我的代码: -
WebClient myPivotsWC = new WebClient();
string nodeValue;
string htmlCode = myPivotsWC.DownloadString("http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlCode);
HtmlNode node = doc.DocumentNode.SelectSingleNode("/html[1]/body[1]/div[3]/div[1]/table[1]/tbody[1]/tr[3]/td[1]/table[1]/tbody[1]/tr[5]/td[3]");
nodeValue=(node.InnerText);
谢谢, 将
答案 0 :(得分:26)
你不能依赖开发工具,如FireBug或Chrome等......来确定你所追求的节点的XPATH,因为这些工具给出的XPATH对应于内存中的HTML DOM,而Html Agility Pack只知道服务器发回的原始HTML。
您需要做的是直观地查看发回的内容(或只是查看源代码)。你会看到没有TBODY元素。所以你想找到任何有区别的东西,例如使用XPATH axes。此外,您的XPATH即使有效,也不会对文档中的更改产生很大的抵抗力,因此您需要找到更加“稳定”的内容,以便更好地面向未来。
这是一个似乎有用的代码:
HtmlNode node = doc.DocumentNode.SelectSingleNode("//td[@class='dnTableCell']//a[text()='High']/../../td[3]");
这就是它的作用:
答案 1 :(得分:2)
喜欢 Simon Mourier explaind,你获得了服务器发送的原始HTML。您需要的元素尚未呈现,因此您无法检索它,因为它不存在于DOM中。解决这个问题的一个简单方法是使用Web渲染器来构建DOM,而不是抓取HTML并抓取它。 我像这样使用WatiN:
WatiN.Core.Settings.MakeNewInstanceVisible = false;
WatiN.Core.Settings.AutoMoveMousePointerToTopLeft = false;
IE ie = new IE();
ie.GoTo(urlLink);
ie.WaitForComplete();
string html = ie.Html;
ie.close();