System.ArgumentNullException 尝试使用 Xpath (C#) 访问跨度时
System.ArgumentNullException when trying to access span with Xpath (C#)
所以我一直在尝试让一个程序运行,我从 google 财务部门获取有关不同股票统计信息的信息。到目前为止,我还无法从跨度中获取信息。截至目前,我已经对直接访问苹果股票进行了硬编码。
Link 至 Apple 股票:https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=NgItWIG1GIftsAHCn4zIAg
我无法理解的是,当我在 chrome 控制台中使用以下命令尝试时,我收到了正确的输出:
$x("//*[@id=\"appbar\"]//div//div//div//span");
这是我在 Visual studio 2015 年安装的 Html Agility Pack 中的当前代码(我怀疑 currDocNodeCompanyName 有问题):
class StockDataAccess
{
HtmlWeb web= new HtmlWeb();
private List<string> testList;
public void FindStock()
{
var histDoc = web.Load("https://www.google.com/finance/historical?q=NASDAQ%3AAAPL&ei=q9IsWNm4KZXjsAG-4I7oCA.html");
var histDocNode = histDoc.DocumentNode.SelectNodes("//*[@id=\"prices\"]//table//tr//td");
var currDoc = web.Load("https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=CdcsWMjNCIe0swGd3oaYBA.html");
var currDocNodeCurrency = currDoc.DocumentNode.SelectNodes("//*[@id=\"ref_22144_elt\"]//div//div");
var currDocNodeCompanyName = currDoc.DocumentNode.SelectNodes("//*[@id=\"appbar\"]//div//div//div//span");
var histDocText = histDocNode.Select(node => node.InnerText);
var currDocCurrencyText = currDocNodeCurrency.Select(node => node.InnerText);
var currDocCompanyName = currDocNodeCompanyName.Select(node => node.InnerText);
List<String> result = new List<string>(histDocText.Take(6));
result.Add(currDocCurrencyText.First());
result.Add(currDocCompanyName.Take(2).ToString());
testList = result;
}
public List<String> ReturnStock()
{
return testList;
}
}
我一直在尝试 Xpath 表达式 [文本] 并收到一个输出,我可以在使用 chrome 控制台时使用该输出,但不能在 VS 中使用。我也一直在试验 foreach 循环,一些人向其他人推荐了它。
class StockDataAccess
{
HtmlWeb web= new HtmlWeb();
private List<string> testList;
public void FindStock()
{
///same as before
var currDoc = web.Load("https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=CdcsWMjNCIe0swGd3oaYBA.html");
HtmlNodeCollection currDocNodeCompanyName = currDoc.DocumentNode.SelectNodes("//*[@id=\"appbar\"]//div//div//div//span");
///Same as before
List <string> blaList = new List<string>();
foreach (HtmlNode x in currDocNodeCompanyName)
{
blaList.Add(x.InnerText);
}
List<String> result = new List<string>(histDocText.Take(6));
result.Add(currDocCurrencyText.First());
result.Add(blaList[1]);
result.Add(blaList[2]);
testList = result;
}
public List<String> ReturnStock()
{
return testList;
}
}
如果有人能指出正确的方向,我将不胜感激。
如果您检查 currDoc.DocumentNode.InnerHtml 的内容,您会注意到没有 ID 为 "appbar" 的元素,因此结果是正确的,因为 xpath 没有 return任何东西。
我怀疑您要查找的 html 元素是由脚本(例如 js)生成的,这就解释了为什么您可以在浏览器而不是 HtmlDocument 对象上看到它,由于 HtmlAgilityPack 不呈现脚本,它只下载和解析原始源代码。
所以我一直在尝试让一个程序运行,我从 google 财务部门获取有关不同股票统计信息的信息。到目前为止,我还无法从跨度中获取信息。截至目前,我已经对直接访问苹果股票进行了硬编码。 Link 至 Apple 股票:https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=NgItWIG1GIftsAHCn4zIAg
我无法理解的是,当我在 chrome 控制台中使用以下命令尝试时,我收到了正确的输出:
$x("//*[@id=\"appbar\"]//div//div//div//span");
这是我在 Visual studio 2015 年安装的 Html Agility Pack 中的当前代码(我怀疑 currDocNodeCompanyName 有问题):
class StockDataAccess
{
HtmlWeb web= new HtmlWeb();
private List<string> testList;
public void FindStock()
{
var histDoc = web.Load("https://www.google.com/finance/historical?q=NASDAQ%3AAAPL&ei=q9IsWNm4KZXjsAG-4I7oCA.html");
var histDocNode = histDoc.DocumentNode.SelectNodes("//*[@id=\"prices\"]//table//tr//td");
var currDoc = web.Load("https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=CdcsWMjNCIe0swGd3oaYBA.html");
var currDocNodeCurrency = currDoc.DocumentNode.SelectNodes("//*[@id=\"ref_22144_elt\"]//div//div");
var currDocNodeCompanyName = currDoc.DocumentNode.SelectNodes("//*[@id=\"appbar\"]//div//div//div//span");
var histDocText = histDocNode.Select(node => node.InnerText);
var currDocCurrencyText = currDocNodeCurrency.Select(node => node.InnerText);
var currDocCompanyName = currDocNodeCompanyName.Select(node => node.InnerText);
List<String> result = new List<string>(histDocText.Take(6));
result.Add(currDocCurrencyText.First());
result.Add(currDocCompanyName.Take(2).ToString());
testList = result;
}
public List<String> ReturnStock()
{
return testList;
}
}
我一直在尝试 Xpath 表达式 [文本] 并收到一个输出,我可以在使用 chrome 控制台时使用该输出,但不能在 VS 中使用。我也一直在试验 foreach 循环,一些人向其他人推荐了它。
class StockDataAccess
{
HtmlWeb web= new HtmlWeb();
private List<string> testList;
public void FindStock()
{
///same as before
var currDoc = web.Load("https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=CdcsWMjNCIe0swGd3oaYBA.html");
HtmlNodeCollection currDocNodeCompanyName = currDoc.DocumentNode.SelectNodes("//*[@id=\"appbar\"]//div//div//div//span");
///Same as before
List <string> blaList = new List<string>();
foreach (HtmlNode x in currDocNodeCompanyName)
{
blaList.Add(x.InnerText);
}
List<String> result = new List<string>(histDocText.Take(6));
result.Add(currDocCurrencyText.First());
result.Add(blaList[1]);
result.Add(blaList[2]);
testList = result;
}
public List<String> ReturnStock()
{
return testList;
}
}
如果有人能指出正确的方向,我将不胜感激。
如果您检查 currDoc.DocumentNode.InnerHtml 的内容,您会注意到没有 ID 为 "appbar" 的元素,因此结果是正确的,因为 xpath 没有 return任何东西。
我怀疑您要查找的 html 元素是由脚本(例如 js)生成的,这就解释了为什么您可以在浏览器而不是 HtmlDocument 对象上看到它,由于 HtmlAgilityPack 不呈现脚本,它只下载和解析原始源代码。