0

Есть ряд вопросов, которые не могу решить уже часа 2, буду благодарен за помощь.

(Для примера буду использовать следующий url для парса https://ru.wiktionary.org/wiki/%D1%85%D0%BE%D1%80%D0%BE%D1%88%D0%BE)

var config = Configuration.Default.WithDefaultLoader();
var address = "https://ru.wiktionary.org/wiki/%D1%85%D0%BE%D1%80%D0%BE%D1%88%D0%BE";
var context = BrowsingContext.New(config);
var document = context.OpenAsync(address).Result;
  1. Хочу получить элемент

div.vector-body#bodyContent

Режим разработчика любого браузера с легкостью находит его

Режим разработчика любого браузера с легкостью находит его, но следующая строчка кода вернет мне null:

return document?.QuerySelector("div.vector-body#bodyContent") == null; //true

В чем может быть проблема? Что я делаю не так? Я, конечно, понимаю, что могу получить этот элемент другим способом, но что с этим не так?

  1. Основной вопрос: Хочу получить количество непосредственно дочерних элементов (находящихся на глубине 1) узла

div.mw-parser-output > *

Браузер правильно сообщает, что элементов 42: введите сюда описание изображения

А вот следующая строка кода вернет 3:

return document?.QuerySelectorAll("div.mw-parser-output > *").Length; //Возвращает 3

Буду рад каждому ответу, спасибо.

hlooo
  • 15
  • 3
  • Наверное содержимое страницы приезжает не в основном запросе, а в AJAX уже после того как страница загружена, и элемент, который вы ищете добавляется на страницу яваскриптом. Смотрите вкладку Сеть в инструментах рахработчика в браузере, там весь трафик и данные. Попробуйте для теста Console.WriteLine(await new HttpClient.GetStringAsync("https://url"));. Не забудьте у метода void поменять на async Task, чтобы сделать его асинхронным и использовать await. Никогда не используйте .Result. – aepot Aug 16 '21 at 13:08
  • 1
    Запомните одно простое правило: не берите за основу те данные, что видите в браузере! Почему? Да потому, что очень часто они отличаются от оригинала, ведь сайт потом запускает JS или другую логику, которая меняет содержимое страницы. Напишите в вашем коде document.ToHtml().Contains("vector-body");, что выдаст? Вот простейший тест. Что касается "возвращает 3", тоже, смотрим html. – EvgeniyZ Aug 16 '21 at 13:12
  • @EvgeniyZ спасибо большое, немного прояснился в этом вопросе. Но проблема осталась, как мне тогда парсить страницу, если нужных мне узлов нет при использовании document.QuerySelectorAll? – hlooo Aug 17 '21 at 09:13
  • @hlooo Вы меня наверно не услышали. Я вам сказал "Не берите за основу те данные, что в браузере". Это значит что? Правильно, берете HTML через код (в вашем случае это document.ToHtml()), кидаете его в блокнот (или что вам удобней) и смотрите, есть ли там нужные данные и где они находятся. Если данных нет, то анализируете трафик, смотрите куда сайт идет за всем нужным. Конкретно на этом сайте все данные есть в HTML, просто не под теми тегами, что в браузере. – EvgeniyZ Aug 17 '21 at 10:23

0 Answers0