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
相关产品推荐
相关产品推荐

