从 Webview 中提取文本

问题描述 投票:0回答:2

我基本上想从已经加载到应用程序

Webview
的网页中提取文本。

作为试验,我借助这篇文章中的方法构建了一个应用程序来计算卢比符号(₹)的出现次数。

见截图: App's Screenshot

但我无法让它发挥作用。

TextView
应该显示网页上“₹”符号的数量,但它保持不变。

我是 Android 的菜鸟,非常感谢任何帮助:)

这是我的代码: (主要活动)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    static TextView count;

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

        count = (TextView) findViewById(R.id.textView);

    /* An instance of this class will be registered as a JavaScript interface */
        class MyJavaScriptInterface {
            @JavascriptInterface
            @SuppressWarnings("unused")
            public void processHTML(String html) {
                // process the html as needed by the app

                int occ = 0;

                for(int i = 0 ; i < html.length() ; i++)
                    if(html.charAt(i) == '₹')
                        occ++;

                MainActivity.count.setText(occ);
            }
        }

        final WebView browser = (WebView) findViewById(R.id.browser);

        /* JavaScript must be enabled if you want it to work, obviously */
        browser.getSettings().setJavaScriptEnabled(true);

        /* Register a new JavaScript interface called HTMLOUT */
        browser.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

        /* WebViewClient must be set BEFORE calling loadUrl! */
        browser.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {

                /* This call inject JavaScript into the page which just finished loading. */
                browser.loadUrl("javascript:HTMLOUT.processHTML(document.documentElement.outerHTML);");

            }
        });

        /* load a web page */
        browser.loadUrl("https://www.google.co.in/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=buy+chocolate");
    }
}
javascript java android web-crawler
2个回答
1
投票

开始工作了。两个小问题:

  1. 您正在 JavaScript 调用的函数中进行 UI 调用。那是不允许的。 将

    MainActivity.count.setText(occ);
    替换为

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            count.setText(String.valueOf(occ));
        }
    });
    
  2. 这段代码已经修复了第二个问题:调用
    setText(int)
    需要一个资源ID,因此你需要先转换成一个字符串。

(您还需要从您的

static
声明中删除
count


0
投票

虽然提供的代码是正确的,但 Kotlin 支持更简单的版本

val webView = findViewById<WebView>(R.id.webView)
webView.getSettings().setJavaScriptEnabled(true)
webView.webViewClient = object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        webView.evaluateJavascript("document.body.textContent") { text ->
            var count = 0
            for (ch in text) if (ch == 'a') count++
            Log.d(TAG, "Webpage contains $count a's")
        }
    }
}
webView.loadUrl(downloadURL)

单行 evaluateJavaScript 替换了(更长的)MyJavaScriptInterface

注意:提供的代码使用“document.body.textContent”而不是“document.documentElement.outerHTML”。其他值也是可能的,包括 document.body.innerHTML 和 document.body.outerHTML

© www.soinside.com 2019 - 2024. All rights reserved.