obtenir seulement le premier
  • de
    • c# html-agility-pack

      Question

      Voici le problème. J'ai des sites web et quelques sous-pages

      sous-pages: DAMSKIE, MÄSKIE, DZIECIĘCE, SPORT, AKCESORIA, PREMIUM, TOREBKI, WYPRZEDAÅ »,

      Sur chacun de ces éléments, il y a peu d'élémens comme "Półbuty", "Klapki", etc.

      Je peux obtenir des sous-pages mais je ne peux pas obtenir la liste des éléments de catégorisation (Pó‚buty, Klapki, etc.). Si la liste ressemble à: "Pó‚buty", "Klapki", "Obcasy", mon code devient uniquement "Pó‚buty", mais il n'a pas "Klapki" ou "Obcasy".

      [Image de sous-pages + la liste des éléments que j'essaie d'obtenir] [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);
                          }
                      }
      
              }
          }
      }
      

      La partie avec le problème:

          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);
                          }
                      }
      
              }
      

      Réponse populaire

      J'ai eu du succès avec ceci:

      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);
      }
      

      C'est un peu différent de la façon dont vous le faites, mais j'espère au moins que vous pourrez en tirer quelques astuces et l'appliquer à votre propre code.

      Si vous avez également besoin des liens, ajoutez ceci:

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


      Related

      Sous licence: CC-BY-SA with attribution
      Non affilié à Stack Overflow
      Sous licence: CC-BY-SA with attribution
      Non affilié à Stack Overflow