使用HtmlAgilityPack选中表格单行并遍历链接出错求助
问题分析与解决方案
看起来你遇到的问题核心在于没有把链接的查找范围限定在目标行内部——如果直接用全局的XPath(比如//a)去搜索,会匹配整个HTML文档里的所有<a>标签,而不是你选中的那一行下的链接。结合你的代码逻辑,我给你两种修正思路:
思路一:直接在找到的目标行内查找链接(更高效)
没必要先记录行号再二次查找,找到目标行节点后,直接在该节点下搜索<a>标签即可,这样天然限定了范围:
var targetRow = doc.DocumentNode.SelectNodes("//table[@id='sortingTable']/tr") .FirstOrDefault(row => row.InnerText.Contains("Text in cell for which row I want to use")); if (targetRow != null) { var list = new List<SortFile>(); // 只查找当前目标行下的所有<a>标签,用.//a表示从当前节点往下搜索 var linksInTargetRow = targetRow.SelectNodes(".//a"); if (linksInTargetRow != null) { foreach (var link in linksInTargetRow) { // 处理每个链接,比如获取href属性 string href = link.GetAttributeValue("href", string.Empty); // 添加到你的SortFile列表中 list.Add(new SortFile { /* 填充属性 */ }); } } }
思路二:如果一定要用行号查找
如果你坚持先记录行号再定位行,那后续查找链接时必须把XPath的范围限定在该行内,注意XPath的行索引是从1开始的:
var allRows = doc.DocumentNode.SelectNodes("//table[@id='sortingTable']/tr"); int rowNumber = 0; int i = 0; foreach (var row in allRows) { if (row.InnerText.Contains("Text in cell for which row I want to use")) { rowNumber = i + 1; // 转换为XPath的1-based索引 break; } i++; } if (rowNumber > 0) { var list = new List<SortFile>(); // 定位到目标行,然后在该行内搜索<a>标签 var targetRow = doc.DocumentNode.SelectSingleNode($"//table[@id='sortingTable']/tr[{rowNumber}]"); if (targetRow != null) { var linksInTargetRow = targetRow.SelectNodes(".//a"); // 后续处理链接的逻辑同上 } }
关键注意点
- 用
.//a代替//a:前者表示从当前节点(目标行)开始向下递归查找,后者是全局查找整个文档的所有<a>标签,这就是你之前拿到所有链接的根本原因。 - 优先用思路一,避免二次遍历表格,代码更简洁高效。
内容的提问来源于stack exchange,提问作者MTplus
相关产品推荐
相关产品推荐

