HtmlAgilityPack XPath Esta es una cadena sin cerrar

.net c# html html-agility-pack xpath

Pregunta

Necesito analizar una página y obtener texto interno de un cuadro de texto especificado en esa página. Pero, cuando compilé este código:

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

Recibí una excepción desde Xpath con el mensaje "esta cadena no está cerrada". Y ... fuente de la página que necesito analizar alojada en GitHub Gist . UPD: Versión minimalista: Versión minimalista del código visto en MozDevTools ¿Alguien puede ayudarme por favor?

PD Perdón por mi mal inglés! PSS Cuando verifiqué el código de W3C Validator, no hay ninguna etiqueta de desbloqueo ... pero muchos errores (no es mi problema :)) PSSS Sí, estoy usando CEFsharp para ver las páginas, y obtengo fuentes de él. Entonces, si usa autocorrección de HTML, ¿por qué se rompe este código? :(

Respuesta aceptada

Además de la cita única no resuelta en su ".//div[@class='panel]" deberá llamar:

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

Antes de crear una instancia de su documento HtmlDocument porque se permite que los elementos del form se superpongan y, por lo tanto, se manejen de manera diferente, después de eso podrá tratar los formularios como cualquier otro elemento.

así hará lo siguiente:

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

Respuesta popular

Correct SelectSingleNode(".//div[@class='panel]"); a SelectSingleNode(".//div[@class='panel']"); .



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow