Html Agility Pack Xpath no funciona

c# html-agility-pack nullreferenceexception parsing xpath

Pregunta

así que cuando estoy tratando de hacer es analizar un documento HTML usando Html Agility Pack. Cargo el documento html y funciona. El problema radica cuando trato de analizarlo usando XPath. Obtengo una "System.NullReferenceException: 'Referencia de objeto no establecida en una instancia de un objeto'" Error.

Para obtener mi xpath, uso la ventana de desarrollo de Chrome y resalto toda la tabla que tiene las filas que contienen los datos que quiero analizar, haga clic derecho y copie Xpath.

Aquí está mi código

string url = "https://www.ctbiglist.com/index.asp";
        string myPara = "LastName=Smith&FirstName=James&PropertyID=&Submit=Search+Properties";
        string htmlResult;

        // Get the raw HTML from the website
        using (WebClient client = new WebClient())
        {
            client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

            // Send in the link along with the FirstName, LastName, and Submit POST request
            htmlResult = client.UploadString(url, myPara);

            //Console.WriteLine(htmlResult);
        }

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(htmlResult);


        HtmlNodeCollection table = doc.DocumentNode.SelectNodes("//*[@id=\"Table2\"]/tbody/tr[2]/td/table/tbody/tr/td/div[2]/table/tbody/tr[2]/td/table/tbody/tr[2]/td/form/div/table[1]/tbody/tr");

        Console.WriteLine(table.Count);

Cuando ejecuto este código, funciona pero toma todas las tablas del documento HTML.

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

Lo que quiero es una tabla específica que contenga todas las filas de tablas que tengan los datos que quiero analizar en objetos.

¡¡¡Gracias por la ayuda!!!

Respuesta popular

Cambia la linea

from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()

a

from table in doc.DocumentNode.SelectNodes("//table[@id=\"Table2\"]").Cast<HtmlNode()

Esto solo seleccionará una tabla específica con el ID dado. Pero si ha anidado Tablas, entonces ha cambiado su xpath en consecuencia para obtener las filas de la tabla anidada.



Related

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é