使用HtmlAgilityPack解析Mega Millions页面遇空引用错误求助
解决HtmlAgilityPack解析Mega Millions页面的空引用错误
错误原因分析
- XPath表达式错误:你用
//li[@class='results']查找开奖号码,但实际class="results"是<section>标签的属性,开奖号码的<li>标签并没有results类,而是在该section下的<ul>容器内。 - 未处理节点为空的情况:当
SelectNodes找不到匹配的节点时会返回null,直接遍历null集合会触发"对象引用未设置为对象实例"错误。
修正后的代码
String PBUrl = "https://www.usamega.com/mega-millions/results"; Cursor = Cursors.WaitCursor; var Webget = new HtmlWeb(); var doc = Webget.Load(PBUrl); List<int> PbNumbersList = new List<int>(); List<int> MegaBallList = new List<int>(); // 变量名适配Mega Millions,可选调整 // 获取基础开奖号码(排除带class的bonus和multiplier项) var numberNodes = doc.DocumentNode.SelectNodes("//section[@class='results']/ul/li[not(@class)]"); if (numberNodes != null) { foreach (HtmlNode node in numberNodes) { if (int.TryParse(node.InnerText.Trim(), out int num)) { PbNumbersList.Add(num); } } } // 获取Bonus号码(Mega Ball) var bonusNodes = doc.DocumentNode.SelectNodes("//li[@class='bonus']"); if (bonusNodes != null) { foreach (HtmlNode node in bonusNodes) { if (int.TryParse(node.InnerText.Trim(), out int bonusNum)) { MegaBallList.Add(bonusNum); } } }
关键修正点说明
- 精准定位节点:用
//section[@class='results']/ul/li[not(@class)]定位基础开奖号码,匹配section容器下无class属性的li标签;保留//li[@class='bonus']定位Bonus号码,但增加空值判断。 - 避免空引用:遍历
SelectNodes返回的集合前,先判断是否为null。 - 安全类型转换:用
int.TryParse替代Convert.ToInt16,避免因文本格式异常导致程序崩溃,提升代码健壮性。
内容的提问来源于stack exchange,提问作者user2180706
相关产品推荐
相关产品推荐

