如何使用HTML AgilityPack按ID选择元素并获取其InnerHtml?
解决方案
问题分析
doc.DocumentNode.Id("acceptance-list-container")是错误用法,HtmlNode没有名为Id的方法,正确获取指定ID元素的方法是GetElementById。- 你的XPath表达式
/div[@id='acceptance-list-container']仅从文档根节点查找直接子级的div,但目标元素大概率不是根的直接子元素,导致找不到节点,FirstOrDefault()返回null后调用InnerHtml触发空引用异常。
修正后的代码
protected void WebScrapper() { var url = @"https://www.itftennis.com/en/tournament/w15-valencia/esp/2022/w-itf-esp-35a-2022/acceptance-list/"; var webGet = new HtmlWeb(); HtmlDocument doc = webGet.Load(url); // 方法1:使用GetElementById(推荐,ID唯一查找效率更高) var targetElement = doc.GetElementById("acceptance-list-container"); if (targetElement != null) { Response.Write(targetElement.InnerHtml); } else { Response.Write("未找到指定ID的元素"); } // 方法2:使用正确的XPath全局查找(备用方案) // var targetNodes = doc.DocumentNode.SelectNodes("//div[@id='acceptance-list-container']"); // if (targetNodes != null && targetNodes.Count > 0) // { // Response.Write(targetNodes[0].InnerHtml); // } // else // { // Response.Write("未找到指定ID的元素"); // } }
关键修改点
- 替换错误的
Id方法为doc.GetElementById(),这是HTML AgilityPack专门用于ID查找的原生方法。 - XPath表达式改为
//div[@id='acceptance-list-container'],//表示在整个文档范围内查找匹配节点,而非仅根节点的直接子元素。 - 增加空值判断,避免因找不到元素触发
ArgumentNullException。
内容的提问来源于stack exchange,提问作者Learning
相关产品推荐
相关产品推荐

