【问题标题】:Extract text from a Webview从 Web 视图中提取文本
【发布时间】:2016-11-17 18:57:42
【问题描述】:

我基本上想从已经加载到应用程序的Webview 的网页中提取文本。

作为一个试验,我在this post的方法的帮助下构建了一个应用来计算卢比符号(₹)的出现。

看截图: 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


    【解决方案1】:

    让它工作。两个小问题:

    1. 您正在 JavaScript 调用的函数中进行 UI 调用。这是不允许的。 将MainActivity.count.setText(occ); 替换为

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

    (您还需要从count 的声明中删除static

    【讨论】:

    • 嗨,非常感谢。进行这些更改后,该应用程序可以正常工作。只有一个小问题,IDE 说 'occ' 应该声明为 final,因为它是从内部类中访问的。作为临时修复,我将 'occ' 的值存储为 'final int occ2 = occ'' 并将其用作 'count.setText(String.valueOf(occ2));'
    • 对,我通过移动“int occ;”解决了这个问题到 Activity 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2014-07-31
    相关资源
    最近更新 更多