我之前使用过html agility pack,并且通过一些试验和错误获得了良好的结果。我正在尝试使用它来返回一个带有xpath的节点集,右键单击Firefox中的“Copy XPath”。我做了一些搜索,我发现浏览器通常会为表标签添加“tbody”。我尝试了删除它没有运气。这是Firefox给我的xpath:
/html/body/p[3]/table/tbody/tr/td/table/tbody/tr[3]
使用它作为 - 抛出错误:“ 值不能为空。参数名称:源。 ”
这发生在线:
nodeList = htmlDoc.DocumentNode.SelectNodes("/html/body/p[3]/table/tbody/tr/td/table/tbody/tr[3]").ToList();
我将继续阅读,与此同时,如果这对任何人来说都是一个简单的解决方案,我会很感激。
更新:这是实际代码:
protected override List<IDataPoint> ReturnDataPointsFromIndividualAddressString(string AddressString)
{
List<IDataPoint> earningsAnnouncements = new List<IDataPoint>(); //Not used, yet..
HtmlWeb hwObject = new HtmlWeb();
HtmlDocument htmlDoc = hwObject.Load(AddressString);
if (htmlDoc.DocumentNode != null)
{
List<HtmlNode> nodeList = new List<HtmlNode>();
nodeList = htmlDoc.DocumentNode.SelectNodes("/html/body/p[3]/table/tbody/tr/td/table/tbody/tr[3]").ToList();
}
}
看来这行出现了这个错误:
nodeList = htmlDoc.DocumentNode.SelectNodes("/html/body/p[3]/table/tbody/tr/td/table/tbody/tr[3]").ToList();
问题是,如果SelectNodes
方法没有通过xpath表达式找到节点,则返回null
。您可以在此答案中找到类似问题HTML Agility Pack Null Reference的更多信息。然后在null
对象上调用ToList()
方法,这实际上会导致NullReferenceException
。
为避免这种情况,请将此变量检查为null
如下所示:
var nodes = htmlDoc.DocumentNode.SelectNodes(...);
if (nodes != null)
{
nodeList = nodes.ToList();
}