WebView中如何获取页面的数据? Android 赛马林
How to get data from the page in WebView? Android Xamarin
有一个网页(不是我的,也没有 API),我想从中获取数据。这样一个页面的例子
https://warthunder.com/en/community/userinfo/?nick=Keofox
必要的数据在以下块中:
<ul class = "profile-stat__list-sb">
<li class = "profile-stat__list-item"> sb</li>
<li class = "profile-stat__list-item"> 93 </li>
<li class = "profile-stat__list-item"> 64 </li>
<li class = "profile-stat__list-item"> 5 </li>
以前一切都通过 AngleSharp 进行,但最近添加了 Cloudflare 的 DDoS 保护。因此,解析器不工作。延迟,在 WebView 中并行加载不成功。
唯一可能的解决方案(在我看来)是从 WebView 中已加载的页面中提取 HTML 代码(在 WebView 中,页面通过了 Cloudflare 检查并顺利加载)。
- 如何调用类似 "OnPageFinishedLoading" 的事件?
- 如何从 WebView 中提取 HTML 代码并使用它?
您可以使用 Custom WebViewClient 和 AddJavascriptInterface 来实现它:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_other);
webView = FindViewById<WebView>(Resource.Id.webView1);
webView.SetWebViewClient(new WebViewClientClass());
WebSettings websettings = webView.Settings;
websettings.JavaScriptEnabled = true;
websettings.DomStorageEnabled = true;
webView.AddJavascriptInterface(new Foo(this), "Foo");
webView.LoadUrl("file:///android_asset/demo.html");
}
class WebViewClientClass : WebViewClient
{
public override void OnReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, string host, string realm)
{
}
public override void OnPageFinished(WebView view, string url)
{
view.LoadUrl("javascript:window.Foo.showSource("
+ "document.getElementsByTagName('html')[0].innerHTML);");
base.OnPageFinished(view, url);
}
}
class Foo : Java.Lang.Object
{
Context context;
public Foo(Context context)
{
this.context = context;
}
[JavascriptInterface]
[Export]
public void showSource(string html)
{
Log.Error("content", html);//here html is the HTML code
}
}
有一个网页(不是我的,也没有 API),我想从中获取数据。这样一个页面的例子
https://warthunder.com/en/community/userinfo/?nick=Keofox
必要的数据在以下块中:
<ul class = "profile-stat__list-sb">
<li class = "profile-stat__list-item"> sb</li>
<li class = "profile-stat__list-item"> 93 </li>
<li class = "profile-stat__list-item"> 64 </li>
<li class = "profile-stat__list-item"> 5 </li>
以前一切都通过 AngleSharp 进行,但最近添加了 Cloudflare 的 DDoS 保护。因此,解析器不工作。延迟,在 WebView 中并行加载不成功。
唯一可能的解决方案(在我看来)是从 WebView 中已加载的页面中提取 HTML 代码(在 WebView 中,页面通过了 Cloudflare 检查并顺利加载)。
- 如何调用类似 "OnPageFinishedLoading" 的事件?
- 如何从 WebView 中提取 HTML 代码并使用它?
您可以使用 Custom WebViewClient 和 AddJavascriptInterface 来实现它:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_other);
webView = FindViewById<WebView>(Resource.Id.webView1);
webView.SetWebViewClient(new WebViewClientClass());
WebSettings websettings = webView.Settings;
websettings.JavaScriptEnabled = true;
websettings.DomStorageEnabled = true;
webView.AddJavascriptInterface(new Foo(this), "Foo");
webView.LoadUrl("file:///android_asset/demo.html");
}
class WebViewClientClass : WebViewClient
{
public override void OnReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, string host, string realm)
{
}
public override void OnPageFinished(WebView view, string url)
{
view.LoadUrl("javascript:window.Foo.showSource("
+ "document.getElementsByTagName('html')[0].innerHTML);");
base.OnPageFinished(view, url);
}
}
class Foo : Java.Lang.Object
{
Context context;
public Foo(Context context)
{
this.context = context;
}
[JavascriptInterface]
[Export]
public void showSource(string html)
{
Log.Error("content", html);//here html is the HTML code
}
}