получить только первый
  • из
    • c# html-agility-pack

      Вопрос

      Вот проблема. У меня есть сайты и несколько подстраниц

      подстраницы: DAMSKIE, MÄŠSKIE, DZIECIÄ~CE, SPORT, AKCESORIA, PREMIUM, TOREBKI, WYPRZEDAÅ »,

      На каждом из них мало категорий, таких как «PóÅ,buty», «Klapki» и т. Д.

      Я могу получить Subpages, но я не могу получить список категоризирующих элементов (PóÅ, buty, Klapki и т. Д.). Если список выглядит так: «PóÅ.buty», «Klapki», «Obcasy», мой код получает только «PóÅ.buty», но он не получает «Klapki» или «Obcasy».

      [Изображение подстраниц + список элементов, пытающихся получить] [1]

      using HtmlAgilityPack;
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Net.Http;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace Crawler_Shoes
      {
          public class Crawl
          {
              private static string navBar = "megamenu__item";
              private const string shoesTypes = "sidebar-section__wrapper sidebar-section__wrapper--categories";
              private static string mainSite = "https://www.eobuwie.com.pl/";
              public static List<string> categoriesNames = new List<string>();
              public static List<string> linksNames = new List<string>();
              public static List<string> categoriesOfCategoriesNames = new List<string>();
              private readonly List<Shoes> shoes = new List<Shoes>();
      
              public static async Task<IEnumerable<HtmlNode>> HttpClient(string site, string descendant, string equals)
              {
                  var httpClient = new HttpClient();
                  var html = await httpClient.GetStringAsync(site);
                  var htmlDocument = new HtmlDocument();
                  htmlDocument.LoadHtml(html);
                  return htmlDocument.DocumentNode.Descendants(descendant)
                      .Where(node => node.GetAttributeValue("class", "").Equals(equals)).ToList();
              }
              public static async Task GetCategories()
              {
                  var menu = await HttpClient(mainSite, "li", navBar);                      
                  foreach (var nav in menu)
                  {
                      //links.Add(nav.Descendants("a").FirstOrDefault().ChildAttributes("href").FirstOrDefault().Value);
                      categoriesNames.Add(nav.Descendants("a").FirstOrDefault().InnerText); //gets names of categories
                      linksNames.Add(nav.Descendants("a").FirstOrDefault().ChildAttributes("href").FirstOrDefault().Value); //gets links for categories
                      if(categoriesNames.Last() == "\n\t\t\tWyprzedaż\t\t")
                      {
                          categoriesNames.Remove(categoriesNames.Last());
                          linksNames.Remove(categoriesNames.Last());
                      }
                  }
                  Crawl.GetCategoriesofCategories();
              }
              public static async Task GetCategoriesofCategories()
              {
                      for (var i = 0; i <= categoriesNames.Count-1; i++)
                      {
                          var categories = await HttpClient(linksNames.ElementAt(i), "ul", shoesTypes);
                          categoriesOfCategoriesNames.Add(categoriesNames.ElementAt(i));
                          foreach(var li in categories)
                          {
                              categoriesOfCategoriesNames.Add(li.Descendants("a").FirstOrDefault().ChildAttributes("href").FirstOrDefault().Value);
                          }
                      }
      
              }
          }
      }
      

      Часть проблемы:

          public static async Task GetCategoriesofCategories()
                  {
                          for (var i = 0; i <= categoriesNames.Count-1; i++)
                          {
                              var categories = await HttpClient(linksNames.ElementAt(i), "ul", shoes
      
      Types);
                          categoriesOfCategoriesNames.Add(categoriesNames.ElementAt(i));
                          foreach(var li in categories)
                          {
                              categoriesOfCategoriesNames.Add(li.Descendants("a").FirstOrDefault().ChildAttributes("href").FirstOrDefault().Value);
                          }
                      }
      
              }
      

      Популярные ответы

      У меня был успех:

      string url = "https://www.eobuwie.com.pl/damskie.html";
      HtmlWeb web = new HtmlWeb();
      HtmlDocument doc = web.Load(url);
      var sidebar = doc.DocumentNode.SelectSingleNode("//ul[@class='sidebar-section__wrapper sidebar-section__wrapper--categories']");
      var categories = sidebar.SelectNodes("li");
      foreach (var category in categories)
      {
          var anchor = category.SelectSingleNode("a");
          string shoeCategory = anchor.InnerText.Trim();
          Console.WriteLine(shoeCategory);
      }
      

      Это немного отличается от того, как вы это делаете, но я, по крайней мере, надеюсь, что вы сможете принять некоторые намеки на это и применить его к своему собственному коду.

      Если вам нужны ссылки, добавьте это:

      string shoeCategoryLink = anchor.GetAttributeValue("href", string.Empty);
      


      Related

      Лицензировано согласно: CC-BY-SA with attribution
      Не связан с Stack Overflow
      Лицензировано согласно: CC-BY-SA with attribution
      Не связан с Stack Overflow