HtmlAgilityPack XPath Ceci est une chaîne non fermée

.net c# html html-agility-pack xpath

Question

Je dois analyser une page et obtenir le texte interne de la zone de texte spécifiée sur cette page. Mais, quand j'ai compilé ce code:

HtmlAgilityPack.HtmlDocument infoDoc = new HtmlAgilityPack.HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Closed;
infoDoc.LoadHtml(@ProblemPageSource.ToString());
HtmlNode bodyGlobal = @infoDoc.DocumentNode.SelectSingleNode(".//body").SelectSingleNode(".//div[@class='global']");
HtmlNode globalRight = @bodyGlobal.SelectSingleNode(".//div[@class='globalRight']");
HtmlNode formPanel = @globalRight.SelectSingleNode(".//form").SelectSingleNode(".//div[@class='panel]");
ProblemCode = @formPanel.SelectNodes(".//div")[0].SelectSingleNode(".//textarea").OuterHtml.ToString(); //And here is now NullRefEx :(
codeEditor.Text = @ProblemCode.ToString();

J'ai eu une exception levée de Xpath avec le message "cette chaîne n'est pas fermée". Et ... source de la page que je dois analyser hébergé chez GitHub Gist . UPD: Version minimaliste: Version minimaliste du code affiché dans MozDevTools Est-ce que quelqu'un peut m'aider s'il vous plaît?

PS Désolé pour mon mauvais anglais! PSS Lorsque j'ai vérifié le code auprès du validateur W3C, il n'y a pas de balises non fermées ... mais de nombreuses erreurs (ce n'est pas mon problème :)) PSSS Oui, j'utilise CEFsharp pour afficher les pages et je reçois des sources. Donc, s'il utilise la correction automatique du code HTML, pourquoi ce code est-il cassé? :(

Réponse acceptée

En plus de la simple citation dans votre ".//div[@class='panel]" vous devrez appeler:

HtmlAgilityPack.HtmlNode.ElementsFlags.Remove("form");

Avant de créer une instance de votre document HtmlDocument car les éléments de form sont autorisés à se chevaucher et sont donc gérés différemment. Vous pourrez ensuite traiter les formulaires comme tout autre élément.

alors ce qui suit doit faire:

 HtmlAgilityPack.HtmlNode.ElementsFlags.Remove("form");
 HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Closed;
 var infoDoc = new HtmlAgilityPack.HtmlDocument();
 infoDoc.LoadHtml(@ProblemPageSource.ToString());
 HtmlNode bodyGlobal = infoDoc.DocumentNode.SelectSingleNode("//body//div[@class='global']");
 HtmlNode globalRight = @bodyGlobal.SelectSingleNode(".//div[@class='globalRight']");
 HtmlNode formPanel = @globalRight.SelectSingleNode(".//form//div[@class='panel']");
 var ProblemCode = @formPanel.SelectSingleNode(".//div/textarea").OuterHtml.ToString();

Réponse populaire

Corriger SelectSingleNode(".//div[@class='panel]"); to SelectSingleNode(".//div[@class='panel']"); .




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