bekomme nur zuerst
  • von
    • c# html-agility-pack

      Frage

      Hier ist das Problem. Ich habe eine Website und einige Unterseiten

      Unterseiten: DAMSKIE, MÄ~SKIE, DZIECIÄ- CE, SPORT, AKCESORIA, PREMIUM, TOREBKI, WYPRZEDAÅ »

      Auf jedem von ihnen sind einige kategorisierende Elemente wie "PÅ,,Buty", "Klapki" usw.

      Ich kann Unterseiten bekommen, aber ich kann die Liste der kategorisierenden Elemente (Pó,buty, Klapki usw.) nicht bekommen. Wenn die Liste wie folgt aussieht: "Pó,buty", "Klapki", "Obcasy" bekommt mein Code nur "Pébuty", aber er bekommt nicht "Klapki" oder "Obcasy".

      [Bild der Unterseiten + die Liste der Elemente, die ich bekommen möchte] [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);
                          }
                      }
      
              }
          }
      }
      

      Der Teil mit dem Problem:

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

      Beliebte Antwort

      Ich hatte Erfolg damit:

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

      Es ist ein bisschen anders als, wie Sie es tun, aber ich hoffe zumindest, dass Sie in der Lage sein werden, einige Hinweise davon zu nehmen und es auf Ihren eigenen Code anzuwenden.

      Wenn Sie auch die Links benötigen, fügen Sie Folgendes hinzu:

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



      Lizenziert unter: CC-BY-SA with attribution
      Nicht verbunden mit Stack Overflow
      Ist diese KB legal? Ja, lerne warum
      Lizenziert unter: CC-BY-SA with attribution
      Nicht verbunden mit Stack Overflow
      Ist diese KB legal? Ja, lerne warum