如何使用Html Agility Pack解析包含多标签的HTML节点并提取内容
解决方案
直接使用Html Agility Pack内置的节点查询、属性提取方法即可完成需求,比正则更稳定不易出错,修改后的代码如下:
... HtmlNodeCollection nodes = webContent.DocumentNode.SelectNodes("//*[@id='node-name']/ul/li"); foreach (HtmlNode node in nodes) { // 先定位当前li下的a标签 HtmlNode aNode = node.SelectSingleNode(".//a"); if (aNode == null) continue; // 容错处理,避免空节点报错 String link = aNode.GetAttributeValue("href", string.Empty); // 提取href属性 // 提取a标签下不含子标签的纯链接文本,结构固定时也可直接用aNode.FirstChild.InnerText.Trim() String text = string.Join("", aNode.ChildNodes .Where(n => n.NodeType == HtmlNodeType.Text) .Select(n => n.InnerText)).Trim(); // 如果你需要包含small在内的所有a标签文本,直接用 String text = aNode.InnerText.Trim(); String nums = aNode.SelectSingleNode(".//small")?.InnerText.Trim() ?? string.Empty; // 提取small标签内容 ... }
关键说明
GetAttributeValue(属性名, 默认值):Html Agility Pack封装的属性读取方法,当属性不存在时直接返回你指定的默认值,不需要手动判空处理。- 子节点查询的XPath路径开头加
.:代表从当前循环的li节点开始向下查询,不加.会从整个HTML文档根节点查询,导致取到错误的结果。 ?.和??语法:针对可能不存在的small标签做容错,避免空引用异常。
内容的提问来源于stack exchange,提问作者ssd
相关产品推荐
相关产品推荐

