【问题标题】:Android WebView: get html div from websiteAndroid WebView:从网站获取 html div
【发布时间】:2016-11-25 20:41:02
【问题描述】:

我想用 webview 从网站获取 div 数据。对不起,我的英语不好。谢谢。

我的网站代码

<html>
    <div id="test">get this data</div>
</html>

我的主要活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String url = "http://website.com";
        WebView view = (WebView) this.findViewById(R.id.webView);
        view.getSettings().setJavaScriptEnabled(true);
        view.loadUrl(url);
    }
}

【问题讨论】:

    标签: javascript android jquery webview


    【解决方案1】:

    好吧,我分两步做:Native 代码向 JS 部分发送请求,然后 JS 向 Native 发送回数据。 为此,您必须在 Native 中组织一些 JS 接口并将其添加到您的“onCreate”中。不是很复杂。这是代码: JS接口:

     public class JavaScriptInterface {
            Context mContext;        
            private GoogleApiClient client;            
            public JavaScriptInterface(Context c) {
                mContext = c;
            }
    
            @JavascriptInterface
            public void getDataFromJs(String divData){
                //here is your code
            }
    }
    

    现在您可以像这样将它添加到“onCreate”中:

    public class MainActivity extends AppCompatActivity {
      public static WebView view;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        String url = "http://website.com";
        view = (WebView) this.findViewById(R.id.webView);
        view.getSettings().setJavaScriptEnabled(true);
        view.setWebChromeClient(new WebChromeClient());
        view.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        view.getSettings().setBlockNetworkImage(false);
        view.getSettings().setAllowFileAccess(true);
        view.getSettings().setAllowFileAccessFromFileURLs(true);
        view.getSettings().setAllowUniversalAccessFromFileURLs(true);              
        view.addJavascriptInterface(new JavaScriptInterface(this), "Android");
    
        view.loadUrl(url);
      }
    }
    

    这里我们为 JavaScriptInterface 命名为 Android。 然后在 Native 中向 JS 添加一些发送请求(或数据)的函数是合乎逻辑的(您必须在“onCreate”之后将其添加到 MainActivity 类):

    public static String sendToJS(final String inStr, final String address) {
        final String sendStr = String.format("javascript:%s('%s')", address, inStr.toString());
        String response = "";
        try {
             view.post(new Runnable() {
                @Override
                public void run() {
                    view.loadUrl(sendStr);
                }
            });
            response = sendStr;
        }catch(Exception e){
            response = e.getMessage();
        }
        return response;
    }
    

    在 JS 中寻址函数:

    function myFunction(inData){
       //your code cares about inData if you need it
       var outData = document.getElementById("test").innerHTML;
       Android.getDataFromJs(outData );
    }
    

    最后的用法(来自 Native):

    sendToJS("yourStringData", "myFunction");
    

    您在“getDataFromJs”方法中的 JavaScriptInterface 中得到的答案。 对你有帮助吗?

    【讨论】:

    • 谢谢@LeonidZ 您可以将您的代码添加到我的代码中吗?因为我不懂安卓。谢谢。
    • 我看到了这篇文章,但不起作用stackoverflow.com/questions/6034948/…
    • 嗨@LeonidZ 您的代码是否从 webviev 获取数据?我想在 webview 中获取数据,因为我有登录系统。如果用户登录到我的网站,我想获取用户名
    • 好吧,现在我已将我的代码插入到您的代码中。另外,我添加了
    • 好吧,现在我已将我的代码插入到您的代码中。此外,您还可以看到可选权限。
    【解决方案2】:

    使用AsyncTask 向您的服务器发出HTTP GET 请求,然后一旦您可以将页面的数据(html) 作为字符串解析并使用RegEx group 从其中提取您想要的内容。 现在您可以使用webView.loadData(htmlString, "text/html", "UTF-8") 加载webview 中的内容

    【讨论】:

    • 我想在 webview 中获取数据,因为我有登录系统。如果用户登录到我的网站,我想获取用户名。
    • @brave,我已经更新了我的答案,请检查一下,让我知道它是否有效
    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多