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

#c# #xpath #web

#c# #xpath #веб

Вопрос:

 string Url = "https://www.rottentomatoes.com/browse/dvd-all/?services=netflix_iw";
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlWeb().Load(Url);

foreach ( var node in htmlDoc.DocumentNode.SelectNodes("/html/body[@class='body  ']/div[@class='body_main container']/div[@id='main_container']/div[@id='main-row']/div[@id='content-column']/div[@id='movies-collection']/div[@class='mb-movies list-view']/div[@class='mb-movie']"))
{
    string movieTitle = node.InnerText;
    richTextBox1.Text  = movieTitle   System.Environment.NewLine;
}
  

Я хочу извлечь все названия фильмов из этого URL-адреса, перейдя по XPath. VS говорит, что у меня нет ссылки на объект. Почему? Можете ли вы попробовать для меня в этом конкретном случае?

Ответ №1:

Следующий фрагмент кода сработал для меня:

 string Url = "https://www.rottentomatoes.com/browse/dvd-all/?services=netflix_iw";
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlWeb().Load(Url);

IEnumerable<string> movieTitles = from movieNode in htmlDoc.DocumentNode.Descendants()
                                  where movieNode.GetAttributeValue("class", "").Equals("movieTitle")
                                  select movieNode.InnerHtml;
  

Он использует LINQ для доступа к узлам, содержащим название фильма.

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

1. можете ли вы объяснить мне, что именно вы сделали в запросе linq? Я не знаю XPath, поэтому я рад, если вы мне объясните. Большое вам спасибо!!

2. @CRK У меня есть доступ к узлам class=movieTitle . Все эти узлы являются <h3> элементами HTML и содержат название фильма. Это сработало для вас?

3. Да! Для меня это тоже работает нормально. Последний вопрос: почему вы оставляете второй параметр в movieNode. GetAttributeValue(«class», «») пустой? а что, если у узла нет параметра «class»? LinQ пропустить это?

4. Я замечаю еще одну вещь: на веб-странице есть больше, чем первые результаты, которые возвращает запрос linq, потому что на веб-странице есть кнопка «Показать больше», которая показывает другие фильмы. Как я могу отслеживать все 380 фильмов на странице, а не только первые?

5. можете ли вы мне помочь??