Xamarin.forms 从Xamarin表单Web视图获取HTML文档

Xamarin.forms 从Xamarin表单Web视图获取HTML文档,xamarin.forms,xamarin.forms.webview,Xamarin.forms,Xamarin.forms.webview,我试图以标准HTML字符串的形式获取webview的内容,但结果是一个编码字符串,我似乎无法取消编码。下面是一个简单的示例来说明: XAML: 以下是输出的前几行: <html lang=\"en-us\" dir=\"ltr\" class=\"exp-4694 exp-4694T3 js exp-4065 exp-4065T1\"><head data-info=\"{&quot;v&qu

我试图以标准HTML字符串的形式获取webview的内容,但结果是一个编码字符串,我似乎无法取消编码。下面是一个简单的示例来说明:

XAML:

以下是输出的前几行:

<html lang=\"en-us\" dir=\"ltr\" class=\"exp-4694 exp-4694T3 js exp-4065 exp-4065T1\"><head data-info=\"{&quot;v&quot;:&quot;1.0.7502.2744&quot;,&quot;a&quot;:&quot;1d1b0ad9-2b52-4c52-a443-3cb3a1c98a83&quot;,&quot;cn&quot;:&quot;OneDeployContainer&quot;,&quot;az&quot;:&quot;{did:92e7dc58ca2143cfb2c818b047cc5cd1, rid: OneDeployContainer, sn: marketingsites-prod-odeastus, dt: 2018-05-03T20:14:23.4188992Z, bt: 2020-07-16T09:31:28.0000000Z}&quot;,&quot;ddpi&quot;:&quot;2&quot;,&quot;dpio&quot;:&quot;&quot;,&quot;dpi&quot;:&quot;2&quot;,&quot;dg&quot;:&quot;uplevel.web.mobile.webkit.ios&quot;,&quot;th&quot;:&quot;default&quot;,&quot;m&quot;:&quot;en-us&quot;,&quot;l&quot;:&quot;en-us&quot;,&quot;mu&quot;:&quot;en-us&quot;,&quot;rp&quot;:&quot;/en-us/&quot;,&quot;f&quot;:&quot;sfwaaa,atperf680t2,5583t1,enablebuynowctrl,5355t1,3857t1,4694t2,3286t1,tasmigration010,cartemberpl,disablenorefunds,daconvertenabled,myflightcf&quot;,&quot;bh&quot;:{}}\" class=\"at-element-marker\">\n        <meta charset=\"UTF-8\">
\n
在其他Web视图(如Plugin.HybridWebView)中,结果与预期一致。我正试图找到一种使用“官方”网络视图的方法,因为大多数其他视图都不再维护


如何取消对该字符串的编码/取消扫描或阻止webview首先对其进行编码?

实际上是Xamarin.Forms返回本机平台按设计返回的内容,平台返回的内容是转义html,即第三方webview(Plugin.HybridWebView)正在做一些额外的事情来取消html的外观,比如剥离无关的内容:
“,”…

作为一种解决方法,我们可以通过调用以下行来获得html,而不需要任何转义引号

private async void WebView_Navigated(object sender, WebNavigatedEventArgs e)
        {
            var webView = sender as WebView;
            // instead of getting the html with the EvaluateJavaScriptAsync method
            //var html = await webView.EvaluateJavaScriptAsync("document.documentElement.outerHTML");

            // they can get it with an HttpClient:
            HttpClient client = new HttpClient();
            var html = await client.GetStringAsync((webView.Source as UrlWebViewSource).Url);
        }
从本期GitHub bug报告中一位名为“jgold6”的用户那里,他提出了以下建议:

// fetch the document element
var page = await controller.EvaluateJavaScriptAsync("document.documentElement.outerHTML");

// Unescape that damn Unicode Java bull.
page = Regex.Replace(page, @"\\[Uu]([0-9A-Fa-f]{4})", m => char.ToString((char)ushort.Parse(m.Groups[1].Value, NumberStyles.AllowHexSpecifier)));
page = Regex.Unescape(page);

这有效地解决了我的问题。这也是Lucas在上面提出的建议。感谢大家在这方面的帮助。

这是因为编码格式。您可以通过
WebUtility.HtmlDecode(html)对html字符串进行解码
谢谢@LucasZhang MSFT。这就很接近了,但是所有的字符串文本都是双转义的。例如,字符串显示为“\\\”而不是“\”“我可以换一个,但我觉得这不太安全。想法?您可以使用正则表达式再次手动转换字符串。感谢您的帮助,Lucas。当我继续研究这个问题时,我发现WebView.EvaluateJavascriptAsync()的这个非标准实现存在更多问题,例如在传递格式完美的JS时出现EOF错误。同样的代码也适用于Flatter和其他第三方Xamarin webview实现,但不适用于Xamarin的webview。我将在Xamarin中将此记录为一个bug。它现在起作用了吗?这种方法的缺点是我们要获取两次页面。整个晚上都在尝试从我的WebView获取HtmlAgilityPack和Html,以便玩球,并且在尝试选择节点或FindElement时不返回任何元素。我以为我的问题会归结到一些编码!奇怪,这是唯一涉及它的问题/答案!
private async void WebView_Navigated(object sender, WebNavigatedEventArgs e)
        {
            var webView = sender as WebView;
            // instead of getting the html with the EvaluateJavaScriptAsync method
            //var html = await webView.EvaluateJavaScriptAsync("document.documentElement.outerHTML");

            // they can get it with an HttpClient:
            HttpClient client = new HttpClient();
            var html = await client.GetStringAsync((webView.Source as UrlWebViewSource).Url);
        }
// fetch the document element
var page = await controller.EvaluateJavaScriptAsync("document.documentElement.outerHTML");

// Unescape that damn Unicode Java bull.
page = Regex.Replace(page, @"\\[Uu]([0-9A-Fa-f]{4})", m => char.ToString((char)ushort.Parse(m.Groups[1].Value, NumberStyles.AllowHexSpecifier)));
page = Regex.Unescape(page);