HtmlAgilityPack XPath Это незамкнутая строка

.net c# html html-agility-pack xpath

Вопрос

Мне нужно разобрать страницу и получить внутренний текст из указанного текстового поля на этой странице. Но когда я скомпилировал этот код:

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

У меня было исключение, выброшенное из Xpath с сообщением «эта строка не закрыта». И ... источник страницы, который мне нужно разобрать, размещен в GitHub Gist . UPD: минималистическая версия: минималистическая версия кода, просматриваемого в MozDevTools. Кто- нибудь может мне помочь?

PS Извините за мой плохой английский! PSS Когда я проверил код с помощью W3C Validator, нет никаких разблокированных тегов ... но много ошибок (а не моя проблема :)) PSSS Да, я использую CEFsharp для просмотра страниц, и я получаю от него источники. Итак, если он использует автокоррекцию Html, почему этот код нарушен? :(

Принятый ответ

Помимо опечатанной отдельной цитаты в вашем ".//div[@class='panel]" вам нужно позвонить:

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

Перед созданием экземпляра вашего HtmlDocument поскольку элементы form могут перекрываться и, таким образом, обрабатываться по-разному, после этого вы сможете обрабатывать формы как любой другой элемент.

так что следующее:

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

Популярные ответы

Исправить SelectSingleNode(".//div[@class='panel]"); to SelectSingleNode(".//div[@class='panel']"); ,



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему