C # IronWebScraper может выполнять итерации, но не может получить доступ к одному элементу за раз

#c# #css #arrays #web-scraping #ironwebscraper

#c# #css #массивы #очистка веб-страниц #ironwebscraper

Вопрос:

Webscraper из библиотеки работает в htmlnodes, это трудно объяснить, но я как бы очищаю тег, а затем внутреннюю часть, и я хочу обрабатывать внутреннюю часть как массив, каковым он является по умолчанию в этой библиотеке, но проблема в том, что я могу выполнить итерацию по нему с помощью «цикла for» как и любой другой массив, но по какой-то причине я не могу получить к нему доступ с индексом…

это мой код со ссылкой на веб-сайт, точно такой же, как в документации библиотеки:

В основном:

     static void Main(string[] args) {
        var scraper = new HelloScraper();
        scraper.Start();
    }
  

затем инициализируйте:

     public override void Init() {
        this.LoggingLevel = WebScraper.LogLevel.None;
        this.Request("https://1337x.to/sort-search/Aquaman/time/desc/1/", Parse);
    }
  

А теперь разбор, который доставляет мне проблемы, и я разделю его, чтобы показать, что работает, а что нет.
Это работает:

        public override void Parse(Response response) {
            foreach (var torrentLink in response.Css("tr")) {
                HtmlNode[] torrentContents = torrentLink.Css("td");
                for (int i = 0; i < torrentContents.Length; i  ) {
                    Console.WriteLine($"{i}: {torrentContents[i].InnerText}");
                }
                Console.WriteLine();
            }
        }
  

Чтобы было проще понять, я расскажу здесь об одном «потоке».
этот рабочий фрагмент кода создает:

 0: Aquaman IMAX (2019) AC3 5.1 ITA.ENG 1080p H265 sub NUita.eng Sp33dy94 MIRCrew1
1: 7
2: 0
3: 8pm Oct. 2nd
4: 4.2 GB7
5: Sp33dy94
  

но этот фрагмент кода, который в основном выбирает то, что мне нужно, на основе того же массива с индексами, которые я вижу, которые работают из цикла for:

        public override void Parse(Response response) {
            foreach (var torrentLink in response.Css("tr")) {
                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();
            }
        }
  

это ничего не дает … консоль не отображает ошибку, и когда я попытался ее отладить, похоже, что при попытке доступа по индексу она «указывает на нулевую ссылку».

Может быть, я что-то упускаю, но если к массиву можно получить доступ по индексу в цикле for, он должен быть доступен и за его пределами, я не прав? в чем здесь проблема?

кстати, я не знаю, является ли 1337x.to позволяет веб-очистка или нет, но я не собираюсь ни использовать это в коммерческих целях, ни сам, это просто веб-сайт, с которым я решил попрактиковаться…

Ответ №1:

После многих часов возни в отладчике я понял, что когда я выполняю итерацию с циклом for, он пропускает пустой массив, а первый был пустым, это заголовок таблицы страниц, внутри которой нет значений. добавление простого оператора if для проверки того, превышает ли длина значение 0, устраняет проблему:

 public override void Parse (Response response) {
    foreach (var torrentLink in response.Css ("tr")) {
        HtmlNode[] torrentContents = torrentLink.Css ("td");
        if (torrentContents.Length > 0) {
            string torrentName = torrentContents[0].InnerText;
            string torrentSeeds = torrentContents[1].InnerText;
            string torrentSize = torrentContents[4].InnerText;
            Console.WriteLine ($"{torrentName} --> [Size:{torrentSize} | Seeds:{torrentSeeds}]");
            Console.WriteLine ();
        }
    }
}