Domanda

Ho tabelle html in una pagina web come

<table border=1>
    <tr><td>sno</td><td>sname</td></tr>
    <tr><td>111</td><td>abcde</td></tr>
    <tr><td>213</td><td>ejkll</td></tr>
</table>

<table border=1>
    <tr><td>adress</td><td>phoneno</td><td>note</td></tr>
    <tr><td>asdlkj</td><td>121510</td><td>none</td></tr>
    <tr><td>asdlkj</td><td>214545</td><td>none</td></tr>
</table>

Ora da questa pagina Web utilizzando il pacchetto agility html voglio estrarre i dati dell'indirizzo della colonna e del telefono non solo. Significa che per prima cosa ho trovato in quale tabella c'è l'indirizzo della colonna e il phoneno.Dopo aver trovato quella tabella voglio estrarre i dati di quell'indirizzo della colonna e phoneno cosa dovrei fare?

Posso ottenere il tavolo. Ma dopo quello che dovrei fare non capisco.

E altra cosa: è fattibile che possiamo estrarre i dati dalla tabella attraverso il nome della colonna.

Risposta accettata

Ecco alcuni metodi di supporto che consentono di analizzare le tabelle HTML alle istanze DataTable . Puoi semplicemente scorrere l'array DataTable risultante per trovare quello contenente le colonne che desideri. Il codice è accoppiato con il formato delle tabelle nell'HTML, in questo caso ottiene informazioni sulla colonna dalla prima riga ( <tr> ). Si noti inoltre che non viene eseguito alcun controllo degli errori, quindi questo si interromperà nelle tabelle che non seguono il formato specificato.

Metodi di supporto:

private static DataTable[] ParseAllTables(HtmlDocument doc)
{
    var result = new List<DataTable>();
    foreach (var table in doc.DocumentNode.Descendants("table"))
    {
        result.Add(ParseTable(table));
    }
    return result.ToArray();
}

private static DataTable ParseTable(HtmlNode table)
{
    var result = new DataTable();

    var rows = table.Descendants("tr");

    var header = rows.Take(1).First();
    foreach (var column in header.Descendants("td"))
    {
        result.Columns.Add(new DataColumn(column.InnerText, typeof(string)));
    }

    foreach (var row in rows.Skip(1))
    {
        var data = new List<string>();
        foreach (var column in row.Descendants("td"))
        {
            data.Add(column.InnerText);
        }
        result.Rows.Add(data.ToArray());
    }
    return result;
}

Esempio di utilizzo:

private static DataTable[] ParseAllTables(HtmlDocument doc)
{
    var result = new List<DataTable>();
    foreach (var table in doc.DocumentNode.Descendants("table"))
    {
        result.Add(ParseTable(table));
    }
    return result.ToArray();
}

private static DataTable ParseTable(HtmlNode table)
{
    var result = new DataTable();

    var rows = table.Descendants("tr");

    var header = rows.Take(1).First();
    foreach (var column in header.Descendants("td"))
    {
        result.Columns.Add(new DataColumn(column.InnerText, typeof(string)));
    }

    foreach (var row in rows.Skip(1))
    {
        var data = new List<string>();
        foreach (var column in row.Descendants("td"))
        {
            data.Add(column.InnerText);
        }
        result.Rows.Add(data.ToArray());
    }
    return result;
}

Risposta popolare

Passa attraverso i tablerows e ottieni i valori delle colonne per indice

int index = 0;
foreach(HtmlNode tablerow in table.SelectNodes("tr"))
{
    // skip the first row...
    if(index > 0)
    {
        // select first td element
        HtmlNode td1 = tablerow.SelectSingleNode("td[1]");
        if(td1 != null)
        {
            string address = td1.InnerText;
        }
    }
    index++;
}

Se è possibile modificare la pagina Web, è possibile utilizzare thead per i testi dell'intestazione e tbody per i valori effettivi.

int index = 0;
foreach(HtmlNode tablerow in table.SelectNodes("tr"))
{
    // skip the first row...
    if(index > 0)
    {
        // select first td element
        HtmlNode td1 = tablerow.SelectSingleNode("td[1]");
        if(td1 != null)
        {
            string address = td1.InnerText;
        }
    }
    index++;
}

Quindi non dovrai saltare la prima riga.

int index = 0;
foreach(HtmlNode tablerow in table.SelectNodes("tr"))
{
    // skip the first row...
    if(index > 0)
    {
        // select first td element
        HtmlNode td1 = tablerow.SelectSingleNode("td[1]");
        if(td1 != null)
        {
            string address = td1.InnerText;
        }
    }
    index++;
}

Dai un'occhiata ad alcuni tutorial su xpath, è molto utile con HtmlAgilityPack.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché