parse htmldocument htmlagilitypack agility c# html html-parsing html-agility-pack

c# - htmldocument - Paquete HTML Agility: tablas de análisis



htmlagilitypack xpath (4)

¿Qué tal algo así como: usar HTML Agility Pack

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

Tenga en cuenta que puede hacerlo más bonito con LINQ-to-Objects si lo desea:

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

Quiero usar el paquete de agilidad HTML para analizar tablas de páginas web complejas, pero de alguna manera me pierdo en el modelo de objetos.

Miré el ejemplo de enlace, pero no encontré ninguna tabla de datos de esta manera. ¿Puedo usar XPath para obtener las tablas? Básicamente, me he perdido después de haber cargado los datos sobre cómo obtener las tablas. Ya he hecho esto en Perl y fue un poco torpe, pero funcionó. ( HTML::TableParser ).

También estoy contento si uno puede arrojar luz sobre el orden correcto de los objetos para el análisis sintáctico.


En mi caso, hay una sola tabla que resulta ser una lista de dispositivos de un enrutador. Si desea leer la tabla utilizando TR / TH / TD (fila, encabezado, datos) en lugar de una matriz como se mencionó anteriormente, puede hacer algo como lo siguiente:

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 es simplemente un objeto simple con encabezado y datos como propiedades. El enfoque se ocupa de la nulidad y este caso:

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

que es una fila sin encabezado El objeto HtmlBody con las constantes colgando de él probablemente se deduzca fácilmente, pero aún me disculpo por ello. Vengo del mundo donde, si tienes "en tu código, debe ser constante o localizable.


Línea desde la respuesta anterior:

HtmlDocument doc = new HtmlDocument();

Esto no funciona en VS 2015 C #. Ya no puedes construir un HtmlDocument .

Otra "característica" de MS que hace las cosas más difíciles de usar. Pruebe HtmlAgilityPack.HtmlWeb y revise este enlace para ver un código de muestra.


Lo más simple que he encontrado para obtener el XPath para un Elemento en particular es instalar la extensión FireBug para Firefox. Ir al sitio / página web. Presiona F12 para que aparezca Firebug; Haga clic derecho en el elemento de la página que desea consultar y seleccione "Inspeccionar elemento". Firebug seleccionará el elemento en su IDE, luego haga clic derecho en el Elemento en Firebug y elija "Copiar XPath". Esta función le dará el XPath exacto. Consulta que necesitas obtener el elemento que deseas usando HTML Agility Library.