System.Collections.Generic.List`1 [System.String] Pendant le Webscraping

c# html-agility-pack linq

Question

Avoir actuellement un problème où je ne peux pas obtenir C # pour sortir ma liste dans quelque chose qui est lisible, ce qui signifie que je ne peux pas réellement voir si le Webscraping fonctionne réellement ou s'il extrait des informations incorrectes.

Tout le monde a une idée de la façon dont je peux changer System.Collections.Generic.List1` [System.String] en quelque chose de lisible?

using HtmlAgilityPack;
using NScrape.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace FulcrumBotManager
{
    class Program
    {
        static void Main(string[] args)
        {

            WebClient webClient = new WebClient();
            string download = webClient.DownloadString("http://localhost:1013");

            HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
            html.LoadHtml(download);
            List<List<string>> table = html.DocumentNode.SelectSingleNode("//table")
                        .Descendants("tr")
                        .Skip(1)
                        .Where(tr => tr.Elements("td").Count() > 1)
                        .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                        .ToList();


           table.ForEach(Console.WriteLine);
        }
    }
}

Le HTML en cours de grattage

using HtmlAgilityPack;
using NScrape.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace FulcrumBotManager
{
    class Program
    {
        static void Main(string[] args)
        {

            WebClient webClient = new WebClient();
            string download = webClient.DownloadString("http://localhost:1013");

            HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
            html.LoadHtml(download);
            List<List<string>> table = html.DocumentNode.SelectSingleNode("//table")
                        .Descendants("tr")
                        .Skip(1)
                        .Where(tr => tr.Elements("td").Count() > 1)
                        .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                        .ToList();


           table.ForEach(Console.WriteLine);
        }
    }
}

Réponse acceptée

Fondamentalement, ce que vous avez est une liste de listes de string :-). Cela signifie qu'il s'agit de "deux niveaux de hiérarchie".

Dans l'état actuel, vous ne faites qu'énumérer et écrire chacune des listes internes. Console.WriteLine donné que Console.WriteLine n'est pas familier avec les Lists , il appelle simplement ToString() sur l'instance, qui renvoie le nom du type.

Ce que vous voulez réellement, c'est énumérer également la liste interne:

//enumerate all lists in the outer list
foreach ( var list in table )
{
   //enumerate the inner list
   foreach ( var item in list )
   {
        //output the actual item
        Console.WriteLine( item );
   }
}

Réponse populaire

table.ForEach(x => x.ForEach(Console.WriteLine));

L’explication de Martin est correcte, c’est juste un ajout: vous pouvez le faire comme ceci avec LINQ.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi