Pack d'agilité HTML

c# html-agility-pack html-parsing winforms

Question

J'ai des tableaux HTML dans une page Web, comme

<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>

Maintenant, à partir de cette page Web utilisant le pack d'agilité html, je souhaite extraire les données de l'adresse de la colonne et du numéro de téléphone uniquement. Cela signifie que j'ai d'abord trouvé dans quelle table il y a colonne address et phoneno.Après avoir trouvé cette table, je souhaite extraire les données de cette adresse de colonne et phoneno, que dois-je faire?

Je peux avoir la table. Mais après cela, que dois-je faire ne comprend pas.

Et autre chose: il est possible d'extraire des données de la table par le nom de la colonne.

Réponse acceptée

Voici quelques méthodes d'assistance pour vous aider à analyser des tables HTML avec des instances DataTable . Vous pouvez simplement parcourir le tableau DataTable résultant pour trouver celui qui contient les colonnes souhaitées. Le code est couplé au format des tableaux dans le code HTML. Dans ce cas, il obtient des informations sur les colonnes à partir de la première ligne ( <tr> ). Notez également qu'aucune vérification d'erreur n'est effectuée. Par conséquent, les tables qui ne suivent pas le format spécifié seront effacées.

Méthodes d'assistance:

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

Exemple d'utilisation:

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

Réponse populaire

Parcourez les tables et obtenez les valeurs de colonne par index

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

Si vous pouvez modifier la page Web, vous pouvez utiliser thead pour les textes d'en-tête et tbody pour les valeurs réelles.

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

Ensuite, vous ne devez pas sauter la première ligne.

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

Jetez un oeil à un tutoriel xpath, il est très utile avec HtmlAgilityPack.




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