HTML-Agilitätspaket

c# html-agility-pack html-parsing winforms

Frage

Ich habe HTML-Tabellen in einer Webseite wie

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

Jetzt von dieser Webseite mit HTML-Agility-Pack möchte ich die Daten der Spaltenadresse und Telefon nur extrahieren. Es bedeutet, dass ich zuerst in der Tabelle finde, dort ist Spaltenadresse und phoneno.Nach dem Finden der Tabelle möchte ich die Daten dieser Spaltenadresse und phoneno extrahieren, was soll ich tun?

Ich kann den Tisch holen. Aber danach sollte ich nicht verstehen, was ich tun soll.

Und noch etwas: Es ist machbar, dass wir Daten aus der Tabelle durch den Spaltennamen extrahieren können.

Akzeptierte Antwort

Im Folgenden finden Sie einige Hilfsmethoden, mit denen Sie HTML-Tabellen für DataTable Instanzen analysieren können. Sie können das resultierende DataTable Array einfach durchlaufen, um dasjenige zu finden, das die gewünschten Spalten enthält. Der Code ist mit dem Format der Tabellen im HTML-Code gekoppelt, in diesem Fall erhält er Spalteninformationen aus der ersten Zeile ( <tr> ). Beachten Sie auch, dass keine Fehlerüberprüfung durchgeführt wird. Dies führt dazu, dass Tabellen, die nicht dem von Ihnen angegebenen Format entsprechen, ungültig werden.

Helfer Methoden:

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

Verwendungsbeispiel:

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

Beliebte Antwort

Durchlaufen Sie die Tabellenzeilen und ermitteln Sie die Spaltenwerte nach 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++;
}

Wenn Sie die Webseite ändern können, können Sie thead für Headertexte und tbody für die tatsächlichen Werte verwenden.

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

Dann müssten Sie die erste Reihe nicht überspringen.

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

Werfen Sie einen Blick auf einige Xpath Tutorial, es ist sehr nützlich mit HtmlAgilityPack.




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum