Проблема с XPath Пакета гибкости

#c# #xpath #web-scraping #html-agility-pack #selectnodes

#c# #xpath #очистка веб-страниц #html-agility-pack #выбранные узлы #selectnodes

Вопрос:

Я пытаюсь использовать пакет гибкого управления HTML для поиска определенных ключевых слов в Google, затем просматриваю связанные узлы, пока не найду URL-адрес строки моего веб-сайта, затем анализирую innerHTML узла, на котором я нахожусь, для моего рейтинга в Google.

Я относительно новичок в пакете Agility Pack (например, я начал по-настоящему просматривать его вчера), поэтому я надеялся, что смогу получить некоторую помощь по этому поводу. Когда я выполняю поиск ниже, я каждый раз получаю сбои в своих запросах Xpath. Даже если я вставлю что-то такое простое, как SelectNodes(«//*[@id=’rso’]»). Это что-то, что я делаю неправильно?

     private void GoogleScrape(string url)
    {
        string[] keys = keywordBox.Text.Split(',');
        for (int i = 0; i < keys.Count(); i  )
        {
            var raw = "http://www.google.com/search?num=100amp;q=";
            string search = raw   HttpUtility.UrlEncode(keys[i]);
            var webGet = new HtmlWeb();
            var document = webGet.Load(search);
            loadtimeBox.Text = webGet.RequestDuration.ToString();

            var ranking = document.DocumentNode.SelectNodes("//*[@id='rso']");

            if (ranking != null)
            {
                googleBox.Text = "Something";
            }
            else
            {
                googleBox.Text = "Fail";
            }
           }
          }
  

Комментарии:

1. Какой тип «неудачи» вы получаете?

2. рейтинг var всегда возвращается как null при поиске по тегу .//*[@id=’rso’], что и возвращает все их результаты поиска, у которых на странице нет нескольких результатов. .//*[@id=’resultStats’] возвращает «Что-то», но точный эквивалент в другом теге ничего не возвращает

3. Кроме того, я могу использовать выражения регулярных выражений для поиска одних и тех же «узлов», поэтому я знаю, что они отображаются как там и должны быть доступны для поиска в направлении Xpath, это просто не возвращает результатов

Ответ №1:

Это не вина пакета Agility pack — это вина хитрого Google. Если вы проверите свойство _text HTMLDocument с помощью debugger, вы обнаружите, что у <ol> этого свойства id='rso' при проверке в браузере по какой-то причине нет никаких атрибутов.

Я думаю, в этом случае вы можете просто выполнить поиск по «//ol», потому что на странице результатов Google на данный момент есть только один <ol> тег…

ОБНОВЛЕНИЕ: я выполнил дополнительные проверки. Например, когда я делаю это:

 using (StreamReader sr = 
        new StreamReader(HttpWebRequest
          .Create("http://www.google.com/search?num=100amp;q=test")
          .GetResponse()
          .GetResponseStream()))
{
    string s = sr.ReadToEnd();
    var m2 = Regex.Matches(s, "\sid=('[^'] '|"[^"] ")");
    foreach (var x in m2)
        Console.WriteLine(x);
}
  

Единственными идентификаторами, которые возвращаются, являются: «sflas», «hidden_modes» и «tbpr_12».

В заключение: я использовал пакет Html Agility Pack, и он довольно хорошо справлялся даже с искаженным html (незакрытыми <p> и даже <li> тегами и т.д.).

Комментарии:

1. Спасибо! На самом деле в итоге я обратился к // h3 для получения немного более локализованной информации, но вы указали мне правильный путь.