Html agility pack / xpath selecciona el nodo secundario mediante la ayuda de [índice], por favor.

c#-4.0 html-agility-pack xpath

Pregunta

He estado trabajando durante un tiempo con un nodo configurado en C # / html agility pack, y a través de prueba y error tengo una lista de nodos que quiero recorrer, obteniendo los nodos secundarios de cada uno de los nodos del ciclo. Me gustaría referirme a ellos por índice # (parece ser el más fácil, pero aquí publico). He intentado diferentes formas de formatear el xpath, incluyendo "[0]", "/ [0]", "tr / [0]", etc. Esto es lo que tengo hasta ahora, todo funciona bien hasta el primer comentario línea:

protected override List<IDataPoint> ReturnDataPointsFromIndividualAddressString(string AddressString)
            {
                List<IDataPoint> earningsAnnouncements = new List<IDataPoint>();

                HtmlWeb hwObject = new HtmlWeb();
                HtmlDocument htmlDoc = hwObject.Load(AddressString);

                if (htmlDoc.DocumentNode != null)
                {
                    List<HtmlNode> nodeList = new List<HtmlNode>();

                    var nodes = htmlDoc.DocumentNode.SelectNodes("html[1]/body[1]/table[4]/tr[1]/td[1]/table[1]/tr");

                    if (nodes != null)
                    {
                        foreach (HtmlNode n in nodes)
                        {
                            if (n.OuterHtml.Contains("finance.yahoo.com"))
                                    nodeList.Add(n);
                        }
                    }

                    foreach (HtmlNode node in nodeList)
                    {
                        EarningsAnnouncementDP earningsAnnouncement = new EarningsAnnouncementDP();

                        //Error: Expression must evaluate to a node set.
                        earningsAnnouncement.Company = (node.SelectSingleNode("[0]")).InnerText.ToString();
                        earningsAnnouncement.Ticker = node.SelectSingleNode("[1]").InnerText.ToString();
                        earningsAnnouncement.Estimate = node.SelectSingleNode("[2]").InnerText.ToString();
                        earningsAnnouncement.AnnouncementTime = node.SelectSingleNode("[3]").InnerText.ToString();

                        earningsAnnouncements.Add(earningsAnnouncement);
                    }

                    return earningsAnnouncements;
                }

Respuesta aceptada

Has atravesado hasta tr nodo. Ahora deberías acceder al nodo td . Así que puedes usar el XPATH como abajo.

node.SelectSingleNode("./td[1]").InnerText;
node.SelectSingleNode("td[1]").InnerText;

También se accede al primer nodo td como td[1] y no td[0] .

Como Alex señaló, puedes escribir algo como abajo, que es una excelente sugerencia.

node.ChildNodes[0].InnerText

HTH



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é