使用 android 将 Web javascript 内容解析为字符串

Parsing web javascript content to string using android

我想把一个网站的内容读成一个字符串。

我开始使用 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 加载 url 然后使用 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 的请求...您会看到很多请求 back/forth.

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

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,contains,%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 headers(通常:session、referer、accept 和其他一些潜在的 cookie 值)

它不会是直截了当的,但您实际上是在网络请求之一的 JSON 响应之一的页面上寻找 url:

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

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