如何将 WebView2 文档加载到 HtmlAgilityPack 中

How to load a WebView2 document into HtmlAgilityPack

提问人:Pan ache 提问时间:8/20/2023 更新时间:8/21/2023 访问量:115

问:

我无法弄清楚如何将 WebView2 文档加载到 HTML Agility Pack 中。我正在使用 JavaScript 将 DOM 作为字符串获取。但是,当我将 DOM 字符串加载到 HtmlAgilityPack 文档中时,每次尝试解析它都会返回 null。

这将编译:

string dom = await webView21.CoreWebView2.ExecuteScriptAsync("document.body.outerHTML"); // Get the DOM with JavaScript
if (dom.Contains("div"))
   System.Diagnostics.Debug.WriteLine("At least one div in the DOM"); // Prints

HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument();
htmlDocument.LoadHtml(dom);
var divs = htmlDocument.DocumentNode.SelectNodes("//div");
if (divs == null)
   System.Diagnostics.Debug.WriteLine("divs is null"); // Prints

当我运行这个代码片段时,第一个 if 子句确认字符串 dom 包含至少一个 div。但是,当字符串加载到 htmlDocument 中时,第二个 if 子句显示变量 divs 为 null。变量 divs 的计数应至少为 1。我在做一些愚蠢的事情,但我不知道是什么。

javascript c# dom html-agility-pack webview2

评论


答:

0赞 Pan ache 8/20/2023 #1

使用 JavaScript 获取 DOM 将 unicode 字符留在字符串 dom 中,即。“\u003C”代替“<”。获取 DOM 后,可以使用以下命令删除这些

dom = System.Text.RegularExpressions.Regex.Unescape(dom);

这回答了这个问题。

顺便说一句,使用“documentElement”而不是“body”会得到更多的dom,即。

string dom = await webView.ExecuteScriptAsync("document.documentElement.outerHTML"); // Get the DOM with JavaScript

评论

0赞 David Risney 9/2/2023
它不仅仅是无法逃避的。ExecuteScriptAsync 的结果是执行脚本的 JSON 编码结果。在...outerHTML,结果是 JavaScript 字符串,因此 ExecuteScriptAsync 的结果是 JSON 编码的 JavaScript 字符串。因此,您需要将 JSON 解析为字符串,并提取该 JavaScript 字符串的值。这里对此进行了更多讨论:learn.microsoft.com/en-us/microsoft-edge/webview2/how-to/...