System.Collections.Generic.List`1 [System.String] mientras se realiza el rastreo web

c# html-agility-pack linq

Pregunta

Actualmente tengo un problema en el que no puedo hacer que C # muestre mi lista en algo que sea legible, lo que significa que no puedo ver si el rastreo web está funcionando o está obteniendo información incorrecta.

¿Alguien tiene alguna idea de cómo puedo cambiar System.Collections.Generic.List1` [System.String] a algo legible?

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

El HTML siendo raspado

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

Respuesta aceptada

Básicamente lo que tienes es una lista de listas de string :-). Eso significa que es "dos niveles de jerarquía".

En el estado actual, solo está enumerando y escribiendo cada una de las listas internas. Debido a que Console.WriteLine no está familiarizado con las Lists , solo llama a ToString() en la instancia, que genera el nombre del tipo.

Lo que realmente quieres es enumerar la lista interna también:

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

Respuesta popular

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

La explicación de Martin es correcta, solo una adición: puedes hacerlo así con LINQ.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué