Html Agility Pack Xpath ne fonctionne pas

c# html-agility-pack nullreferenceexception parsing xpath

Question

Ainsi, lorsque j'essaie de le faire, c'est d'analyser un document HTML à l'aide de HTML Agility Pack. Je charge le doc html et ça marche. Le problème réside lorsque j'essaie de l'analyser à l'aide de XPath. Je reçois une "System.NullReferenceException: 'Référence d'objet non définie à une instance d'un objet.'" Erreur.

Pour obtenir mon xpath, j'utilise la fenêtre de développement Chrome et surligne l'intégralité de la table contenant les lignes contenant les données à analyser, cliquez dessus avec le bouton droit de la souris et copiez Xpath.

Voici mon code

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

Lorsque j'exécute ce code, il fonctionne mais récupère toutes les tables du document 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);
}

Ce que je veux, c'est une table spécifique contenant toutes les lignes de la table contenant les données que je veux analyser en objets.

Merci pour l'aide!!!

Réponse populaire

Changer la ligne

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

à

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

Cela ne sélectionnera qu'une table spécifique avec un identifiant donné. Mais si vous avez des tables imbriquées, vous devez modifier votre xpath en conséquence pour obtenir les lignes de la table imbriquée.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi