¿Desea analizar elementos de datos únicos de tablas HTML con C #?

c# html-agility-pack web-scraping

Pregunta

Tengo este código en mi función principal y quiero analizar solo la primera fila de la tabla (p. Ej., 7 de noviembre de 2017 73.78 74.00 72.32 72.71 17,245,947).

Creé un nodo que concluye solo la primera fila, pero cuando comienzo a depurar, el valor del nodo es nulo. ¿Cómo puedo analizar estos datos y almacenarlos, por ejemplo, en una cadena o en variables individuales? ¿Hay alguna manera?

WebClient web = new WebClient();

        string page = web.DownloadString("https://finance.google.com/finance/historical?q=NYSE:C&ei=7O4nV9GdJcHomAG02L_wCw");

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(page);

        var node = doc.DocumentNode.SelectSingleNode("//*[@id=\"prices\"]/table/tbody/tr[2]");

  List<List<string>> node = doc.DocumentNode.SelectSingleNode("//*[@id=\"prices\"]/table").Descendants("tr").Skip(1).Where(tr => tr.Elements("td").Count() > 1).Select(tr => tr.Elements("td").Select(td=>td.InnerText.Trim()).ToList()).ToList() ;

Respuesta aceptada

Parece que su cadena de XPath de selección tiene errores. Dado que tbody es un nodo generado, no debe incluirse en la ruta:

//*[@id=\"prices\"]/table/tr[2]

Si bien esto debería leer el valor, HtmlAgilityPack llega a otro problema con malformed html . Todos los nodos <tr> y <td> en el texto analizado no tienen etiquetas de cierre </tr> o </td> y HtmlAgitilityPack no puede seleccionar valores de la tabla con filas mal formadas. Por lo tanto, es necesario seleccionar en el primer paso la tabla completa:

//*[@id=\"prices\"]/table/tr[2]

Y en el siguiente paso, desinfecte el HTML agregando </tr> y </td> cerrando las etiquetas y repita el análisis con la tabla corregida o use la cadena extraída para analizarla a mano, simplemente extraiga las líneas 10 a 15 de la cadena de la tabla y divídalos en > personaje. El análisis en bruto se muestra a continuación. El código está probado y funcionando.

//*[@id=\"prices\"]/table/tr[2]



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué