问题描述
我想将网站内容读成字符串。
我首先使用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……您会看到很多请求回传。
似乎包含相关内容的两个是:
需要令牌才能访问来自以下位置的令牌:
..可能需要JSessoinId,它来自:
https://merhav.nli.org.il/primo_library/libweb/webservices/rest/v1/configuration/NLI
..因此,为了复制调用链,您可以使用JSoup发出这些(以及任何其他相关的)HTTP GET请求,拉出相关的HTTP标头(通常:会话,引用,接受和一些其他cookie值)可能)
这不会很简单,但是您实际上是在从网络请求之一的JSON响应之一中寻找页面上的网址:
一旦知道要重新创建的请求,您只需备份请求列表并尝试重新创建它们。
这不是一件容易的事,需要大量时间来重新创建-如果您要尝试重新创建,我的建议是,忘记尝试解析HTML,尝试重建/重新创建3个左右的HTTP请求链到后端以获取相关的JSON并进行解析。您通常可以拆开网站,但这是一项艰巨的任务