현재 C #에서 읽을 수있는 항목으로 내 목록을 출력 할 수없는 문제가 발생했습니다. 즉, 실제로 웹 스크래핑이 실제로 작동하는지 또는 잘못된 정보를 가져 오는지를 실제로 볼 수 없음을 의미합니다.
누구든지 System.Collections.Generic.List1` [System.String] 을 읽을 수있는 것으로 변경할 수있는 방법을 알고 있습니까?
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);
}
}
}
긁어 내고있는 HTML
<!DOCTYPE html>
<!-- saved from url=(0022)http://localhost:1013/ -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta http-equiv="refresh" content="5">
<style>#accounts {font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;border-collapse: collapse;margin: 0px auto;}#accounts td, #customers th {font-size: 1em;border: 1px solid #98bf21;padding: 3px 7px 2px 7px;}#accounts th {font-size: 1.1em;text-align: left;padding-top: 5px;padding-bottom: 4px;background-color: #A7C942;color: #ffffff;}#accounts tr.alt td {color: #000000;background-color: #EAF2D3;}</style>
</head>
<body>
<table id="accounts">
<tbody>
<tr>
<th>Run</th>
<th>Region</th>
<th>Username</th>
<th>Max IP</th>
<th>Game</th>
<th>Spell 1</th>
<th>Spell 2</th>
<th>Summoner</th>
<th>Lvl</th>
<th>Total IP</th>
<th>Total RP</th>
<th>Status</th>
</tr>
<tr>
<td>False</td>
<td>EUW</td>
<td>sage</td>
<td>0</td>
<td>ARAM</td>
<td>Barrier</td>
<td>Heal</td>
<td>Summoner</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10:26:45 Disconnected</td>
</tr><tr class="alt">
<td>False</td>
<td>EUW</td>
<td>wily</td>
<td>0</td>
<td>ARAM</td>
<td>Barrier</td>
<td>Heal</td>
<td>Summoner</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10:26:45 Disconnected</td>
</tr><tr>
<td>False</td>
<td>EUW</td>
<td>miles</td>
<td>0</td>
<td>ARAM</td>
<td>Barrier</td>
<td>Heal</td>
<td>Summoner</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10:26:46 Disconnected</td>
</tr><tr class="alt">
<td>False</td>
<td>EUW</td>
<td>cookie</td>
<td>0</td>
<td>ARAM</td>
<td>Barrier</td>
<td>Heal</td>
<td>Summoner</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10:26:47 Disconnected</td>
</tr><tr>
<td>False</td>
<td>EUW</td>
<td>lazors</td>
<td>0</td>
<td>ARAM</td>
<td>Barrier</td>
<td>Heal</td>
<td>Summoner</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>10:26:48 Disconnected</td>
</tr></tbody>
</table>
<center>Updated core files | 00:50:56:C0:00:01 00:50:56:C0:00:08 00:21:CC:73:5B:BF 08:11:96:F7:A7:0C 00:FF:8B:11:85:F4 <br>Refreshes every 5 seconds</center>
</body>
</html>
기본적으로 가지고있는 것은 string
리스트입니다 :-). 그것은 그것이 "두 계층 구조"임을 의미합니다.
현재 상태에서는 각 내부 목록 자체를 열거하고 쓰는 중입니다. Console.WriteLine
은 Lists
익숙하지 않으므로 유형 이름을 출력하는 인스턴스에서 ToString()
을 호출하기 만하면됩니다.
실제로 원하는 것은 내부 목록도 열거하는 것입니다.
//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 );
}
}
table.ForEach(x => x.ForEach(Console.WriteLine));
마틴에 대한 설명은 정확합니다. LINQ를 사용하면 이렇게 할 수 있습니다.