由于数据来自 javascript,因此您必须解析 javascript 而不是 html,因此 Agility Pack 的帮助不大,但它使事情变得更容易一些。以下是如何使用 Agility Pack 来完成此操作Newtonsoft JSON.Net解析 Javascript。
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.Load(new WebClient().OpenRead("http://www.nasdaq.com/quotes/nasdaq-100-stocks.aspx"));
List<string> listStocks = new List<string>();
HtmlNode scriptNode = htmlDoc.DocumentNode.SelectSingleNode("//script[contains(text(),'var table_body =')]");
if (scriptNode != null)
{
//Using Regex here to get just the array we're interested in...
string stockArray = Regex.Match(scriptNode.InnerText, "table_body = (?<Array>\\[.+?\\]);").Groups["Array"].Value;
JArray jArray = JArray.Parse(stockArray);
foreach (JToken token in jArray.Children())
{
listStocks.Add("http://www.nasdaq.com/symbol/" + token.First.Value<string>().ToLower());
}
}
更详细地解释一下,数据来自页面上的一个大 JavaScript 数组var table_body = [...
。
每只股票都是数组中的一个元素,并且本身就是一个数组。
["ATVI", "Activision Blizzard, Inc", 11.75, 0.06, 0.51, 3058125, 0.06, "N", "N"]
因此,通过解析数组并获取第一个元素并附加修复 url,我们得到与 javascript 相同的结果。