使用Android将Web JavaScript内容解析为字符串

问题描述

我想将网站内容读成字符串。

我首先使用jsoup,如下所示:

private void getWebsite() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            final StringBuilder builder = new StringBuilder();

            try {

                String query = "https://merhav.nli.org.il/primo-explore/search?tab=default_tab&search_scope=Local&vid=NLI&lang=iw_IL&query=any,contains,הארי פוטר";

                Document doc = Jsoup.connect(query).get();
                String title = doc.title();
                Elements links = doc.select("div");

                builder.append(title).append("\n");

                for (Element link : links) {
                    builder.append("\n").append("Link : ").append(link.attr("href"))
                            .append("\n").append("Text : ").append(link.text());
                }
            } catch (IOException e) {
                builder.append("Error : ").append(e.getMessage()).append("\n");
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(builder.toString());

                }
            });
        }
    }).start();
}

但是,问题是在这站点中,当我使用诸如chrome这样的网络浏览器时,它在其中一行中显示

window.appPerformance.timeStamps['index.html']= Date.Now();</script><primo-explore><noscript>JavaScript must be enabled to use the system</noscript><style>.init-message {

因此,我了解到jsoup对于这种情况没有好的解决方案。 即使使用javascript也有什么好方法获取页面的元素?

编辑:

尝试以下建议后,我使用webView加载了网址,然后使用jsoap对其进行了解析,如下所示:

wb_result.getSettings().setJavaScriptEnabled(true);
MyJavaScriptInterface jInterface = new MyJavaScriptInterface();
wb_result.addJavascriptInterface(jInterface,"HtmlViewer");

wb_result.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view,String url) {
        wb_result.loadUrl("javascript:window.HtmlViewer.showHTML ('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
    }
 });

它做到了,确实向我展示了该元素。但是,仍然与浏览器不同,它显示某些行是功能,而不是结果。例如:

ng-href="{{::$ctrl.getDeepLinkPath()}}"

是否可以像浏览器一样解析和显示结果?

谢谢

解决方法

我建议您在chrome开发人员工具中查看“网络”标签,然后提交请求以加载URL……您会看到很多请求回传。

似乎包含相关内容的两个是:

https://merhav.nli.org.il/primo_library/libweb/webservices/rest/primo-explore/v1/pnxs?blendFacetsSeparately=false&getMore=0&inst=NNL&lang=iw_IL&limit=10&newspapersActive=false&newspapersSearch=false&offset=0&pcAvailability=true&q=any,%D7%94%D7%90%D7%A8%D7%99+%D7%A4%D7%95%D7%98%D7%A8&qExclude=&qInclude=&refEntryActive=false&rtaLinks=true&scope=Local&skipDelivery=Y&sort=rank&tab=default_tab&vid=NLI

需要令牌才能访问来自以下位置的令牌:

https://merhav.nli.org.il/primo_library/libweb/webservices/rest/v1/guestJwt/NNL?isGuest=true&lang=iw_IL&targetUrl=https%253A%252F%252Fmerhav.nli.org.il%252Fprimo-explore%252Fsearch%253Ftab%253Ddefault_tab%2526search_scope%253DLocal%2526vid%253DNLI%2526lang%253Diw_IL%2526query%253Dany%252Ccontains%252C%2525D7%252594%2525D7%252590%2525D7%2525A8%2525D7%252599%252520%2525D7%2525A4%2525D7%252595%2525D7%252598%2525D7%2525A8&viewId=NLI

..可能需要JSessoinId,它来自:

https://merhav.nli.org.il/primo_library/libweb/webservices/rest/v1/configuration/NLI

..因此,为了复制调用链,您可以使用JSoup发出这些(以及任何其他相关的)HTTP GET请求,拉出相关的HTTP标头(通常:会话,引用,接受和一些其他cookie值)可能)

这不会很简单,但是您实际上是在从网络请求之一的JSON响应之一中寻找页面上的网址:

enter image description here

一旦知道要重新创建的请求,您只需备份请求列表并尝试重新创建它们。

这不是一件容易的事,需要大量时间来重新创建-如果您要尝试重新创建,我的建议是,忘记尝试解析HTML,尝试重建/重新创建3个左右的HTTP请求链到后端以获取相关的JSON并进行解析。您通常可以拆开网站,但这是一项艰巨的任务