You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:23