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

C# IronWebScraper可遍历数组但无法通过索引访问元素问题

问题分析与解决方案

这个问题其实很常见,我帮你捋一捋~

核心原因:你选中了无关的<tr>元素

你用response.Css("tr")选中了页面上所有的<tr>标签,但页面里不只有你需要的种子数据行——比如表头的<tr>、分页栏的<tr>,甚至可能有空白行,这些行的<td>数量远远少于6个。

  • 当你用for循环时,循环条件是i < torrentContents.Length,会自动适配当前<tr>的<td>数量,不会去访问超出范围的索引,所以能正常执行;
  • 但直接写torrentContents[4]时,一旦遇到<td>数量不足5个的<tr>,要么数组长度不够触发索引越界,要么数组本身为空导致空引用异常,最终代码要么中断,要么没有输出(如果异常被库静默捕获)。

两种解决方案

方案1:先检查数组长度,再访问索引

在访问特定索引前,先确认torrentContents有足够的元素,从逻辑上避免空引用或越界:

public override void Parse(Response response) { 
    foreach (var torrentLink in response.Css("tr")) { 
        HtmlNode[] torrentContents = torrentLink.Css("td"); 
        // 确保数组非空且至少包含5个元素(对应索引0-4)
        if (torrentContents != null && torrentContents.Length >= 5)
        {
            string torrentName = torrentContents[0].InnerText; 
            string torrentSeeds = torrentContents[1].InnerText; 
            string torrentSize = torrentContents[4].InnerText; 
            Console.WriteLine($"{torrentName} --> [Size:{torrentSize} | Seeds:{torrentSeeds}]"); 
            Console.WriteLine(); 
        }
    } 
}

方案2:优化选择器,精准定位目标行

更好的方式是直接过滤出只有种子数据的<tr>,而非选中所有行。打开1337x的页面查看HTML结构,种子行通常会带有特定的class(比如torrent或list-row),用这个class缩小选择范围:

public override void Parse(Response response) { 
    // 替换为页面实际的class,比如假设目标tr的class是"torrent-row"
    foreach (var torrentLink in response.Css("tr.torrent-row")) { 
        HtmlNode[] torrentContents = torrentLink.Css("td"); 
        string torrentName = torrentContents[0].InnerText; 
        string torrentSeeds = torrentContents[1].InnerText; 
        string torrentSize = torrentContents[4].InnerText; 
        Console.WriteLine($"{torrentName} --> [Size:{torrentSize} | Seeds:{torrentSeeds}]"); 
        Console.WriteLine(); 
    } 
}

这种方式从根源上避免了处理无关行,也就不会出现空引用问题了。

内容的提问来源于stack exchange,提问作者David Shnayder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:52:46