Pregunta

Tengo tablas HTML en una página web como

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

Ahora desde esta página web utilizando HTML paquete de agilidad quiero extraer los datos de la dirección de la columna y teléfono solamente. Esto significa, por lo que tengo encontró por primera vez en la que la mesa no hay dirección de columna y phoneno.After encontrar esa mesa que quiero para extraer los datos de esa dirección de columna y PHONENO ¿qué debería hacer?

Puedo conseguir la mesa. Pero después de eso ¿qué debería hacer no entiendo.

Y otra cosa:. Es factible que podemos extraer datos de la tabla a través de nombre de la columna

¿Fue útil?

Solución

Estos son algunos métodos de ayuda para ayudarle a analizar sintácticamente las tablas HTML a DataTable casos. Usted sólo puede iterar a través de la matriz resultante DataTable para encontrar el que contiene las columnas que desee. El código está acoplado con el formato de las tablas en el código HTML, en este caso se obtiene la información de la columna de la primera fila (<tr>). También tenga en cuenta que ninguna comprobación de errores se lleva a cabo, por lo que este será romper la voluntad tablas que no siguen el formato especificado.

métodos auxiliares:

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

Ejemplo de uso:

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

Otros consejos

Loop través filastabla y obtener valores de columna por el índice

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 se puede modificar la página web, puede utilizar la culata en T para los textos de cabecera y tbody para los valores reales.

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

A continuación, usted no tendría que saltar a la primera fila.

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

Tenga una mirada en algún tutorial de XPath, que es muy útil con HtmlAgilityPack.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top