Как скрести таблицу между комментариями в сетку с помощью HtmlAgilityPack? - PullRequest
0 голосов
/ 30 января 2019

В настоящее время пытается очистить таблицу с этой страницы в сетку, используя пакет htmlagilitypack.Я считаю, что мой код успешно извлекает таблицу между комментариями, но когда он собирается создать таблицу данных, он говорит, что не может найти столбец 8, который, очевидно, не должен существовать в этом контексте.Я немного новичок в этом и был бы очень признателен за объяснение того, что я делаю не так

private void GetTeamStats()
{
    var webGet = new HtmlWeb();
    var getPage = webGet.Load("https://www.teamrankings.com/nba/stat/effective-field-goal-pct");
    var commentNode = getPage.DocumentNode.SelectNodes("//comment()[contains(.,'table-filters')]/following::*[not(preceding::comment()[contains(.,'main-wrapper')])]");
    var commentHtml = commentNode.Select(c1 => c1.SelectSingleNode("//table"));

    DataTable dt = new DataTable();
    dt.Columns.Add("Rk", typeof(string));
    dt.Columns.Add("Team", typeof(string));
    dt.Columns.Add("2018", typeof(string));
    dt.Columns.Add("Last3", typeof(string));
    dt.Columns.Add("Last1", typeof(string));
    dt.Columns.Add("Home", typeof(string));
    dt.Columns.Add("Away", typeof(string));
    dt.Columns.Add("2017", typeof(string));

    foreach (var table in commentHtml)
    {
        foreach (var row in table.SelectNodes("//tr"))
        {
            var dr = dt.NewRow();
            dt.Rows.Add(dr);

            int i = 0;
            foreach (var cell in row.SelectNodes("//td"))
            {
                dr[i++] = cell.InnerText;
            }
        }

        gvTeamStats.DataSource = dt;
    }
}

Исключение говорит "System.IndexOutOfRangeException:" Не удается найти столбец 8. "и выбрасываетсяэта строка кода

                    dr[i++] = cell.InnerText;

1 Ответ

0 голосов
/ 30 января 2019

Я внес некоторые изменения:

структура таблицы в View source is:

<table>
<thead>
 <tr>
    <th>Rank</th>
    <th>Team</th>
    <th>2018</th>
    <th>Last 3</th>
    <th>Last 1</th>
    <th>Home</th>
    <th>Away</th>
    <th>2017</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
</tr>
</table>

var webGet = new HtmlWeb();
var getPage = webGet.Load("https://www.teamrankings.com/nba/stat/effective-field-goal-pct");
var tableHeader = getPage.DocumentNode.SelectNodes("//table/thead/tr");
var tableData = getPage.DocumentNode.SelectNodes("//table/tbody/tr");

DataTable dataTable = new DataTable();

var headers = tableHeader
            .Elements("th")
            .Select(th => th.InnerText.Trim());

foreach (var header in headers)
{
    dataTable.Columns.Add(header);
}

var rows = tableData.Select(tr => tr
            .Elements("td")
            .Select(td => td.InnerText.Trim())
            .ToArray());

foreach (var row in rows)
{
    dataTable.Rows.Add(row);
}

// print our datatable
foreach (DataRow dataRow in dataTable.Rows)
{
     foreach (var item in dataRow.ItemArray)
     {
         Console.Write(item + " ");
     }
     Console.WriteLine();
 }
...