当前位置: 首页 > 面试题库 >

是否可以从WebView获取HTML代码

吴展
2023-03-14
问题内容

我想抢先获取要在中加载的网页的HTML代码,webView使用正则表达式解析它,并仅显示所需的HTML代码,同时让该网页仍然认为它已加载了所有内容。

有什么方法可以通过WebViewClient.onLoadResource()或类似方法来做到这一点?

编辑:我尝试过此:

class MyJavaScriptInterface  
 {  
      @SuppressWarnings("unused")  
         public void showHTML(String html, Context context)  
         {  
            new AlertDialog.Builder(context)  
                 .setTitle("HTML")  
                 .setMessage(html)  
                 .setPositiveButton(android.R.string.ok, null)  
             .setCancelable(false)  
             .create();  
               pageHTML = html;
         }  
 }

@Override
    public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) {
        mRom.setFileSize(getFileSize(mRom.getURLSuffix()));
        webview.getSettings().setJavaScriptEnabled(true);
        MyJavaScriptInterface interfaceA = new MyJavaScriptInterface();
        webview.addJavascriptInterface(interfaceA, "HTMLOUT");  
        WebViewClient anchorWebViewClient = new WebViewClient()
        {
            @Override  
            public void onPageFinished(WebView view, String url)  
            {  
                /* This call inject JavaScript into the page which just finished loading. */  
                webview.loadUrl("javascript:window.HTMLOUT.showHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
                Pattern pattern = Pattern.compile("<h2>Winning Sc.+</h2></div>(.+)<br>", Pattern.DOTALL);
                Matcher matcher = pattern.matcher(pageHTML);
                matcher.find();

该接口永远不会被调用


问题答案:

不得不使用HttpClient。无需Cookie,只需解析html:

private String getDownloadButtonOnly(String url){
    HttpGet pageGet = new HttpGet(url);

    ResponseHandler<String> handler = new ResponseHandler<String>() {
        public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
            HttpEntity entity = response.getEntity();
            String html;

            if (entity != null) {
                html = EntityUtils.toString(entity);
                return html;
            } else {
                return null;
            }
        }
    };

    pageHTML = null;
    try {
        while (pageHTML==null){
            pageHTML = client.execute(pageGet, handler);
        }
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

        Pattern pattern = Pattern.compile("<h2>Direct Down.+?</h2>(</div>)*(.+?)<.+?>", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(pageHTML);
        String displayHTML = null;
        while(matcher.find()){
            displayHTML = matcher.group();
        }

    return displayHTML;
}

    @Override
    public void customizeWebView(final ServiceCommunicableActivity activity, final WebView webview, final SearchResult mRom) {
        mRom.setFileSize(getFileSize(mRom.getURLSuffix()));
        webview.getSettings().setJavaScriptEnabled(true);
        WebViewClient anchorWebViewClient = new WebViewClient()
        {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                String downloadButtonHTML = getDownloadButtonOnly(url);
                if(downloadButtonHTML!=null && !url.equals(lastLoadedURL)){
                    lastLoadedURL = url;
                    webview.loadDataWithBaseURL(url, downloadButtonHTML, null, "utf-8", url);
                }
            }


 类似资料:
  • 问题内容: 对于我的调试需求,还算不错。但是,如果可以的 话 ,它会更酷(并且很有帮助)。这可能吗? 问题答案: 有一个项目将iPython嵌入到标准pdb中,因此您可以执行以下操作: 可通过通常的方式安装。 非常短,因此除了easy_installing之外,您还可以在Python路径上的某个位置创建一个文件,并将以下内容粘贴到该文件中:

  • 问题内容: 我正在从另一个来源接收ZipInputStream,并且需要将第一项的InputStream提供给另一个来源。 我希望能够在不将临时文件保存在设备上的情况下执行此操作,但是,我知道获取单个条目的InputStream的唯一方法是通过ZipFile.getInputStream(entry),并且因为我有一个ZipInputStream而不是ZipFile , 这是不可能的。 所以我最好

  • 问题内容: 有什么办法可以让子查询在oracle db中返回多个列?(我知道此特定的sql会导致错误,但总的来说我想要的很好) 我想要这样的结果: 我知道可以通过联接解决此问题,但这不是我要的。 我的问题很简单,是否有办法从子查询中获取两个或多个值?也许一些解决方法使用双重?这样就没有实际的联接,但是每行都有一个新的子查询? 编辑:这是一个原则性问题。我知道,您可以使用join解决所有这些问题。您

  • 问题内容: 现在我有了一些C源代码,我想在我的Java应用程序中使用它。我需要执行C源代码,并将结果返回到我的Java应用程序。与其将所有C源代码重写为Java,我如何在Java应用程序中重用C源代码? 问题答案: 看一下Java Native Interface 。 Java本机接口(JNI)是一种编程框架,它使Java虚拟机(JVM)中运行的Java代码能够被本机应用程序(特定于硬件和操作系统

  • 问题内容: 如何从网站获取HTML代码,进行保存并通过LINQ表达式查找一些文本? 我正在使用以下代码来获取网页的来源: 如何在网页源中的div中查找文本? 问题答案: 从网站获取HTML代码。您可以使用这样的代码。 这将为您提供从网站返回的 HTML 代码。但是通过 LINQ 查找文本并不是那么容易。也许使用正则表达式会更好,但不能与 HTML 代码一起很好地使用

  • 我成功地为应用程序使用了logback,但无法从ch.qos.logback记录消息。我知道一个无法记录初始消息(下面的回答确认了这一点),这是有意义的。我不明白的是,为什么我还不能记录logback完成自身配置后生成的消息。 因此,没有办法告诉Logback将它自己的on-startup-log-events定向到文件附加器。 由ch.qos.logback.classic.net.smtpap