Domanda

Voglio usare l'agility pack HTML per analizzare le tabelle da pagine Web complesse, ma in qualche modo mi sono perso nel modello a oggetti.

Ho guardato l'esempio del link, ma non ho trovato alcun dato sulla tabella in questo modo. Posso usare XPath per ottenere i tavoli? Mi sono praticamente perso dopo aver caricato i dati su come ottenere le tabelle. L'ho già fatto in Perl ed è stato un po 'goffo, ma ha funzionato. ( HTML :: TableParser ).

Sono anche felice se si può semplicemente far luce sul giusto ordine oggetto per l'analisi.

È stato utile?

Soluzione

Che ne dici di qualcosa come: Utilizzo di Pacchetto di agilità HTML

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) {
    Console.WriteLine("Found: " + table.Id);
    foreach (HtmlNode row in table.SelectNodes("tr")) {
        Console.WriteLine("row");
        foreach (HtmlNode cell in row.SelectNodes("th|td")) {
            Console.WriteLine("cell: " + cell.InnerText);
        }
    }
}

Nota che puoi renderlo più carino con LINQ-to-Objects se vuoi:

var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
            from row in table.SelectNodes("tr").Cast<HtmlNode>()
            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
            select new {Table = table.Id, CellText = cell.InnerText};

foreach(var cell in query) {
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText);
}

Altri suggerimenti

Il più semplice che ho trovato per ottenere XPath per un particolare elemento è installare l'estensione FireBug per Firefox vai al sito / pagina web, premi F12 per visualizzare firebug; seleziona a destra e fai clic con il pulsante destro del mouse sull'elemento nella pagina di cui vuoi eseguire una query e seleziona " Ispeziona elemento " Firebug selezionerà l'elemento nel suo IDE, quindi fai clic con il pulsante destro del mouse sull'elemento in Firebug e scegli " Copia XPath " questa funzione ti fornirà l'esatta query XPath di cui hai bisogno per ottenere l'elemento desiderato utilizzando HTML Agility Library.

So che questa è una domanda piuttosto vecchia, ma questa è stata la mia soluzione che mi ha aiutato a visualizzare la tabella in modo da poter creare una struttura di classe. Questo utilizza anche il pacchetto di agilità HTML

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>");
var table = doc.DocumentNode.SelectSingleNode("//table");
var tableRows = table.SelectNodes("tr");
var columns = tableRows[0].SelectNodes("th/text()");
for (int i = 1; i < tableRows.Count; i++)
{
    for (int e = 0; e < columns.Count; e++)
    {
        var value = tableRows[i].SelectSingleNode(<*>quot;td[{e + 1}]");
        Console.Write(columns[e].InnerText + ":" + value.InnerText);
    }
Console.WriteLine();
}

Nel mio caso, esiste una singola tabella che sembra essere un elenco di dispositivi da un router. Se desideri leggere la tabella usando TR / TH / TD (riga, intestazione, dati) invece di una matrice come menzionato sopra, puoi fare qualcosa del tipo seguente:

    List<TableRow> deviceTable = (from table in document.DocumentNode.SelectNodes(XPathQueries.SELECT_TABLE)
                                       from row in table?.SelectNodes(HtmlBody.TR)
                                       let rows = row.SelectSingleNode(HtmlBody.TR)
                                       where row.FirstChild.OriginalName != null && row.FirstChild.OriginalName.Equals(HtmlBody.T_HEADER)
                                       select new TableRow
                                       {
                                           Header = row.SelectSingleNode(HtmlBody.T_HEADER)?.InnerText,
                                           Data = row.SelectSingleNode(HtmlBody.T_DATA)?.InnerText}).ToList();
                                       }  

TableRow è solo un semplice oggetto con intestazione e dati come proprietà. L'approccio si occupa della nullità e questo caso:

<tr>
    <td width="28%">&nbsp;</td>
</tr>

che è una riga senza intestazione. L'oggetto HtmlBody con le costanti che pendono da esso è probabilmente facilmente dedotto, ma mi scuso ancora. Sono venuto dal mondo dove se hai " nel tuo codice, dovrebbe essere costante o localizzabile.

Riga dalla risposta sopra:

HtmlDocument doc = new HtmlDocument();

Questo non funziona in VS 2015 C #. Non è più possibile creare un documento HTML .

Un altro MS "quotazione" " ciò rende le cose più difficili da usare. Prova HtmlAgilityPack.HtmlWeb e controlla questo link per alcuni codici di esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top