C#中如何用XPath按tr分组提取表格所有td元素
当然可以实现!用C#结合HtmlAgilityPack(处理HTML XPath的绝佳工具)就能轻松按<tr>分组提取所有<td>内容,完美匹配你想要的嵌套循环访问方式。下面是具体的实现步骤和代码示例:
第一步:安装依赖库
打开你的NuGet包管理器,搜索并安装HtmlAgilityPack——这个库专门用来处理HTML解析和XPath查询,比原生XML工具更适配不规范的HTML场景。
第二步:核心实现代码
using HtmlAgilityPack; using System; using System.Net.Http; using System.Threading.Tasks; class WorldCupGoalScraper { static async Task Main(string[] args) { string targetUrl = "http://es.fifa.com/worldcup/archive/brazil2014/statistics/players/goal-scored.html"; // 1. 获取目标页面的HTML内容 using HttpClient client = new HttpClient(); string htmlContent; try { // 可以添加User-Agent模拟浏览器请求,避免被反爬拦截 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); htmlContent = await client.GetStringAsync(targetUrl); } catch (Exception ex) { Console.WriteLine($"获取页面失败: {ex.Message}"); return; } // 2. 加载HTML到HtmlDocument进行解析 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(htmlContent); // 3. 用XPath选择所有表格行 // 如果要排除表头行,可改用"//table//tr[td]",只选中包含<td>的数据行 HtmlNodeCollection rows = doc.DocumentNode.SelectNodes("//table//tr"); if (rows == null) { Console.WriteLine("未找到任何表格行"); return; } // 4. 完全按照你想要的嵌套循环方式访问每个单元格 for (int x = 0; x < rows.Count; x++) { HtmlNodeCollection cells = rows[x].SelectNodes(".//td"); if (cells != null) { for (int y = 0; y < cells.Count; y++) { // 清理单元格文本(去除多余空格、换行) string cellContent = cells[y].InnerText.Trim().Replace("\n", "").Replace("\t", ""); Console.WriteLine($"行{x+1},列{y+1}: {cellContent}"); // 这里可以将内容添加到二维数组或集合中存储 } } Console.WriteLine("--- 行分隔线 ---"); } } }
关键细节说明
- XPath表达式:
//table//tr会匹配页面中所有表格的所有行;如果只想获取数据行(跳过表头的<th>行),可以把XPath改成//table//tr[td],只选中包含<td>元素的行。 - 文本清理:
InnerText.Trim().Replace("\n", "").Replace("\t", "")是为了去除HTML里的换行、制表符和多余空格,让提取的内容更规整。 - 反爬注意:添加
User-Agent请求头可以模拟浏览器访问,降低被目标网站拦截的概率。如果请求频繁被拒,可以尝试添加延迟重试机制。
内容的提问来源于stack exchange,提问作者IvanHid
相关产品推荐
相关产品推荐

