10

这是我第一次尝试使用 HAP 获取元素值。尝试使用 InnerText 时出现空对象错误。

我正在抓取的 URL 是:- http://www.mypivots.com/dailynotes/symbol/659/-1/e-mini-sp500-june-2013 我试图从 Day Change 中获取当前高点的值汇总表。

我的代码在底部。首先,我只想知道我是否以正确的方式进行此操作?如果是这样,那么仅仅是我的 XPath 值不正确吗?

XPath 值是使用我发现的一个名为 htmlagility 助手的实用程序获得的。下面 XPath 的萤火虫版本也给出了相同的错误:- /html/body/div[3]/div/table/tbody/tr[3]/td/table/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);

谢谢,威尔。

4

2 回答 2

30

您不能依赖诸如 FireBug 或 Chrome 等开发人员工具来确定您所追求的节点的 XPATH,因为此类工具给出的 XPATH 对应于内存中的 HTML DOM,而 Html Agility Pack只知道服务器发回的原始 HTML。

您需要做的是直观地查看发回的内容(或只是查看源代码)。例如,您会看到没有 TBODY 元素。所以你想找到任何有区别的东西,例如使用XPATH 轴。此外,您的 XPATH,即使它有效,也不会对文档中的更改有很强的抵抗力,因此您需要找到更“稳定”的东西,以便抓取更具前瞻性。

这是一个似乎有效的代码:

HtmlNode node = doc.DocumentNode.SelectSingleNode("//td[@class='dnTableCell']//a[text()='High']/../../td[3]");

这就是它的作用:

  • 找到一个 CLASS 属性设置为“dnTableCell”的 TD 元素。// 标记表示搜索在 XML 层次结构中是递归的。
  • 找到一个包含等于“高”的文本(内部文本)的 A 元素。
  • 向上导航两个父母(我们将到达最近的 TR 元素)
  • 从那里选择第三个 TD 元素
于 2013-04-05T08:01:01.470 回答
2

就像Simon Mourier解释的那样,您获得了服务器发送的原始 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();
于 2013-10-20T08:58:44.583 回答