【发布时间】:2020-11-03 19:36:38
【问题描述】:
我想把一个网站的内容读成一个字符串。
我开始使用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()}}"
有没有办法像在浏览器中一样解析和显示结果?
谢谢
【问题讨论】:
-
看起来没有直截了当的方式,但有this post。
-
我可以在这个网站上为您提供帮助。我喜欢翻译外国新闻网站...这个(点击翻译后)似乎是一个带有电子书的网站。我想先问一下你想做什么。此页面包含 Java-Script,通过
static-pageHTML Scrape 可能无法为您提供您在网络浏览器中看到的内容。 您需要做更多的事情.你想从这个网站得到什么?
标签: javascript java android jsoup