Проблема с Agility Pack XPath

Я пытаюсь использовать HTML Agility Pack для поиска определенных ключевых слов в 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=100&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";
            }
           }
          }

person Danejir    schedule 10.06.2011    source источник
comment
Какой тип отказа вы получаете?   -  person alexn    schedule 10.06.2011
comment
varRanking всегда возвращается как нуль при поиске вещей под тегом .//*[@id='rso'] , и это то, что возвращают все их результаты поиска, которые не имеют нескольких результатов на странице. .//*[@id='resultStats'] возвращает Что-то, но точный эквивалент в другом теге ничего не возвращает   -  person Danejir    schedule 10.06.2011
comment
Кроме того, я могу использовать выражения Regex для поиска одних и тех же узлов, поэтому я знаю, что они отображаются как там и должны быть доступны для поиска в направлении Xpath, просто не возвращая результаты.   -  person Danejir    schedule 10.06.2011


Ответы (1)


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

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

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

using (StreamReader sr = 
        new StreamReader(HttpWebRequest
          .Create("http://www.google.com/search?num=100&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> и т. д.).

person Dmitry    schedule 10.06.2011
comment
Спасибо! На самом деле я остановился на //h3 для более локализованной информации, но вы наставили меня на правильный путь. - person Danejir; 11.06.2011