HtmlAgilityPack не находит определенный узел, который должен быть там - PullRequest
0 голосов
/ 17 мая 2019

Я загружаю URL-адрес и ищу определенный узел, который должен существовать в HTML-документе, но каждый раз он возвращает ноль.Фактически, каждый узел, который я пытаюсь найти, возвращает ноль.Я использовал этот же код на других веб-страницах, но по какой-то причине в этом случае он не работает.Может ли HtmlDoc загружать что-то отличное от источника, который я вижу в своем браузере?

Я, очевидно, плохо знаком с веб-утилизацией, но неоднократно сталкивался с подобного рода проблемами, когда мне приходилось делать сложный обходной путь, потому что яЯ не могу выбрать узел, который я вижу в своем браузере.Есть ли что-то принципиально не так с тем, как я об этом?

string[] arr = { "abercrombie", "adt" };
for(int i=0;i<1;i++)
{
      string url = @"https://www.google.com/search?rlz=1C1CHBF_enCA834CA834&ei=lsfeXKqsCKOzggf9ub3ICg&q=" + arr[i] + "+ticker" + "&oq=abercrombie+ticker&gs_l=psy-ab.3..35i39j0j0i22i30l2.102876.105833..106007...0.0..0.134.1388.9j5......0....1..gws-wiz.......0i71j0i67j0i131j0i131i67j0i20i263j0i10j0i22i10i30.3zqfY4KZsOg";
      HtmlWeb web = new HtmlWeb();
      var htmlDoc = web.Load(url);
      var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'HfMth']");
      Console.WriteLine(node.InnerHtml);
}

enter image description here

ОБНОВЛЕНИЕ

Спасибо RobertBaron за то, что указал мне правильное направление.Вот отличная копия пасты решение .

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Страница, которую вы пытаетесь очистить, имеет код JavaScript, который запускается для загрузки всего содержимого страницы. Поскольку ваш браузер запускает этот javascript, вы видите все содержимое страницы. HtmlWeb.Load() не запускает никакого кода JavaScript, поэтому вы видите только частичную страницу.

Вы можете использовать элемент управления WebBrowser , чтобы очистить эту страницу. Так же, как ваш браузер, он будет запускать любой код JavaScript, и вся страница будет загружена. Есть несколько статей о переполнении стека, которые показывают, как это сделать. Вот некоторые из них.

0 голосов
/ 17 мая 2019

Это содержимое добавляется динамически и отсутствует в том, что возвращается вашим текущим методом + url;вот почему ваш xpath неудачен.Вы можете проверить, что возвращается, например:

var node = htmlDoc.DocumentNode.SelectSingleNode("//*");

Выбор чего-то, что присутствует для вашего первого URL - чтобы показать, что вы можете выбрать узел

var node = htmlDoc.DocumentNode.SelectSingleNode("//span[@class = 'st']");

Вы можете использовать разработчикаИнструменты> вкладка «Сеть», чтобы узнать, доступен ли какой-либо конкретный динамический контент по отдельному URL-адресу запроса xhr.

...