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:

public static void Main(string[] args)
{
    string html = @"
        <html><head></head>
        <body><div>
            <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>
        </div></body>
        </html>";

    HtmlDocument doc = new HtmlDocument();

    doc.LoadHtml(html);

   DataTable addressAndPhones;
   foreach (var table in ParseAllTables(doc))
   {
       if (table.Columns.Contains("phoneno") && table.Columns.Contains("adress"))
       {
           // You found the address and phone number table
           addressAndPhones = table;
       }
   }
}

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.

<table id="mytable">
    <thead><tr><td>Column1</td><td>Column2</td></tr></thead>
    <tbody>
        <tr><td>Value 1</td><td>Value 2</td></tr>
        <tr><td>Value 1</td><td>Value 2</td></tr>
    </tbody>
</table>

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

foreach(HtmlNode tablerow in table.SelectNodes("/table[@id=\"mytable\"]/tbody/tr"))
{
    // ...
}

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



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow