#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 ();
}
}
}