HtmlAgilityPack XPath 这是一个未闭合的字符串
HtmlAgilityPack XPath This is an unclosed string
我需要解析一个页面并从该页面的指定文本框中获取内部文本。但是,当我编译这段代码时:
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 中抛出异常,消息为 "this string is unclosed"。
并且...我需要解析的页面源位于 GitHub Gist。
UPD:简约版:
Minimalistic version of the code viewed in the MozDevTools
有人可以帮我吗?
P.S。对不起,我的英语不好!
P.S.S.当我通过 W3C Validator 检查代码时,没有任何未关闭的标签......但是有很多错误(不是我的问题:))
P.S.S.S.是的,我正在使用 CEFsharp 查看页面,并且我从他那里获取资源。那么,如果它使用 Html 的自动更正,为什么这段代码会被破坏? :(
将 SelectSingleNode(".//div[@class='panel]");
更正为 SelectSingleNode(".//div[@class='panel']");
。
除了 ".//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();
我需要解析一个页面并从该页面的指定文本框中获取内部文本。但是,当我编译这段代码时:
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 中抛出异常,消息为 "this string is unclosed"。 并且...我需要解析的页面源位于 GitHub Gist。 UPD:简约版: Minimalistic version of the code viewed in the MozDevTools 有人可以帮我吗?
P.S。对不起,我的英语不好! P.S.S.当我通过 W3C Validator 检查代码时,没有任何未关闭的标签......但是有很多错误(不是我的问题:)) P.S.S.S.是的,我正在使用 CEFsharp 查看页面,并且我从他那里获取资源。那么,如果它使用 Html 的自动更正,为什么这段代码会被破坏? :(
将 SelectSingleNode(".//div[@class='panel]");
更正为 SelectSingleNode(".//div[@class='panel']");
。
除了 ".//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();