如何用HtmlAgilityPack获取指定表格的tr节点及相关疑问
解决HtmlAgilityPack遍历Kijiji HTML节点的问题
嘿,我来帮你搞定这个问题!先直接拆解要点,再给你修改后的代码:
关于Listing变量是否包含所有子节点
放心,Listing作为选中的table节点,默认会包含所有层级的子节点(包括tbody、tr、td这些)。你可以在foreach里加一行调试代码快速验证:
Console.WriteLine(Listing.InnerHtml);
打印出来的内容会展示这个table下的完整HTML结构,确认所有子节点都被包含在内。
获取class为'description'的tr节点
有两种常用方法,都能精准实现你的需求:
方法1:延续XPath写法(和你当前代码风格一致)
注意要在XPath前加.,表示从当前Listing节点开始搜索,而不是整个文档(避免误拿到其他区域的tr节点):
private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004"; private static HtmlWeb client = new HtmlWeb(); static void Main(string[] args) { var DOM = client.Load(URL); var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]"); if (Featured != null) // 先判空,避免空引用异常 { foreach (var Listing in Featured) { // 从当前table节点下查找class包含description的tr var descriptionTrs = Listing.SelectNodes(".//tr[contains(@class,'description')]"); if (descriptionTrs != null) { foreach (var tr in descriptionTrs) { // 提取标题:找tr下的标题a标签文本 var title = tr.SelectSingleNode(".//a[contains(@class,'title')]")?.InnerText.Trim(); Console.WriteLine(title); } } } } }
方法2:Linq风格写法(更直观易读)
如果你偏好Linq的语法,也可以用Descendants方法筛选:
private static string URL = "https://www.kijiji.ca/b-renovation-contracting-handyman/ontario/home-renovations/k0c753l9004"; private static HtmlWeb client = new HtmlWeb(); static void Main(string[] args) { var DOM = client.Load(URL); var Featured = DOM.DocumentNode.SelectNodes("//table[contains(@class,'top-feature')]"); if (Featured != null) { foreach (var Listing in Featured) { var descriptionTrs = Listing.Descendants("tr") .Where(tr => tr.GetAttributeValue("class", "") .Contains("description")); foreach (var tr in descriptionTrs) { var title = tr.Descendants("a") .FirstOrDefault(a => a.GetAttributeValue("class", "").Contains("title"))? .InnerText.Trim(); Console.WriteLine(title); } } } }
额外小提示
- Kijiji的HTML结构可能会不定期更新,建议你用浏览器开发者工具(F12)随时核对节点的class和层级,避免网站改版导致代码失效。
- 所有节点查找操作都记得判空(比如
SelectNodes可能返回null),用?.空安全运算符能有效避免程序崩溃。
内容的提问来源于stack exchange,提问作者Mark Denom
相关产品推荐
相关产品推荐

