使用 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.
两个似乎包含相关内容的是:
需要令牌才能访问来自以下令牌的令牌:
.. 这可能需要来自的 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 并解析它。您经常可以拆开网站,但这是一项艰巨的工作
我想把一个网站的内容读成一个字符串。
我开始使用 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.
两个似乎包含相关内容的是:
需要令牌才能访问来自以下令牌的令牌:
.. 这可能需要来自的 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 并解析它。您经常可以拆开网站,但这是一项艰巨的工作