Question

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

à partir de cette page Web en utilisant pack agilité html Je veux extraire les données de l'adresse de colonne et téléphone non seulement. Cela signifie pour que je trouve d'abord dans quelle table il y a adresse de colonne et phoneno.After trouver cette table, je veux extraire les données de cette adresse de colonne et phoneno que dois-je faire?

Je peux obtenir la table. Mais après cela que dois-je ne comprends pas.

Et autre chose:. Est possible que l'on peut extraire des données de la table par nom de colonne

Était-ce utile?

La solution

Voici quelques méthodes d'assistance pour vous aider analysez les tables HTML aux instances DataTable. Vous pouvez simplement parcourir le tableau de DataTable résultant de trouver celui qui contient les colonnes que vous voulez. Le code est couplé avec le format des tableaux dans le code HTML, dans ce cas, il obtient des informations de colonne de la première ligne (<tr>). A noter également qu'aucune vérification est effectuée d'erreur, donc cela BREAK tables qui ne suivent pas le format que vous avez spécifié.

Méthodes d'aide:

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

Autres conseils

Boucle par tablerows et obtenir des 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 auriez 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top