Мне нужно разобрать страницу и получить внутренний текст из указанного текстового поля на этой странице. Но когда я скомпилировал этот код:
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']");
,