Xamarin.forms 从Xamarin表单Web视图获取HTML文档
我试图以标准HTML字符串的形式获取webview的内容,但结果是一个编码字符串,我似乎无法取消编码。下面是一个简单的示例来说明: XAML: 以下是输出的前几行: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=\"{"v&qu
<html lang=\"en-us\" dir=\"ltr\" class=\"exp-4694 exp-4694T3 js exp-4065 exp-4065T1\"><head data-info=\"{"v":"1.0.7502.2744","a":"1d1b0ad9-2b52-4c52-a443-3cb3a1c98a83","cn":"OneDeployContainer","az":"{did:92e7dc58ca2143cfb2c818b047cc5cd1, rid: OneDeployContainer, sn: marketingsites-prod-odeastus, dt: 2018-05-03T20:14:23.4188992Z, bt: 2020-07-16T09:31:28.0000000Z}","ddpi":"2","dpio":"","dpi":"2","dg":"uplevel.web.mobile.webkit.ios","th":"default","m":"en-us","l":"en-us","mu":"en-us","rp":"/en-us/","f":"sfwaaa,atperf680t2,5583t1,enablebuynowctrl,5355t1,3857t1,4694t2,3286t1,tasmigration010,cartemberpl,disablenorefunds,daconvertenabled,myflightcf","bh":{}}\" 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);